日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#后台线程更新界面

發布時間:2025/3/18 C# 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#后台线程更新界面 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考文章《C# 線程更新UI界面》

?

主窗口

public frmMain(){InitializeComponent();}/// <summary>/// 主窗口加載事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void frmMain_Load(object sender, EventArgs e){try{//設置默認狀態mc_MachineStatusHander = new Common.MachineStatusHandler(); mc_MachineStatusHander.mc_MachineProduceStatusHandler.UpdateMachineSignalDelegate += UpdateMachineSignalStatus;//后臺線程中指定委托為更新界面方法 mc_MachineStatusHander.ChangeStatus("Online", "運行", "WesChen", "001A");SettingLight();}catch (Exception ex){ShowErrorMessage(ex.Message, "系統初始化");this.Close();}}

?

界面更新主方法

/// <summary>/// 獲取機器信號,并更新界面/// </summary>/// <param name="singnal">機器信號</param>delegate void UpdateMachineProduceSignalDelegate(Common.MachineProduceStatusHandler.SignalType singnal);private void UpdateMachineSignalStatus(Common.MachineProduceStatusHandler.SignalType signal){if (InvokeRequired){this.Invoke(new UpdateMachineProduceSignalDelegate(delegate (Common.MachineProduceStatusHandler.SignalType s){if (signal.ToString().IndexOf("X01") != -1){btn_SignalX01.BackColor= System.Drawing.Color.FromArgb(255, 255, 255);btn_SignalX01.ForeColor = System.Drawing.Color.FromArgb(0, 0, 0);}else{btn_SignalX01.BackColor = System.Drawing.Color.FromArgb(38, 45, 58);btn_SignalX01.ForeColor = System.Drawing.Color.FromArgb(255, 255, 255);} lab_ProductCount.Text = "累計生產數量:" + mc_MachineStatusHander.mc_MachineProduceStatusHandler.ProductCount;lab_LastLifeCycleTime.Text = "最后一次生產用時:" + Common.CommonFunction.FormatMilliseconds(mc_MachineStatusHander.mc_MachineProduceStatusHandler.LastProductUseMilliseconds);}), signal);}else{if (signal.ToString().IndexOf("X01") != -1){btn_SignalX01.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);btn_SignalX01.ForeColor = System.Drawing.Color.FromArgb(0, 0, 0);}else{btn_SignalX01.BackColor = System.Drawing.Color.FromArgb(38, 45, 58);btn_SignalX01.ForeColor = System.Drawing.Color.FromArgb(255, 255, 255);} lab_ProductCount.Text = "累計生產數量:" + mc_MachineStatusHander.mc_MachineProduceStatusHandler.ProductCount;lab_LastLifeCycleTime.Text = "最后一次生產用時:" + Common.CommonFunction.FormatMilliseconds(mc_MachineStatusHander.mc_MachineProduceStatusHandler.LastProductUseMilliseconds);}}

后臺線程

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using System.Text.RegularExpressions; using System.Diagnostics;namespace MES_MonitoringClient.Common {/// <summary>/// 機器生產狀態/// </summary>public class MachineProduceStatusHandler{/// <summary>/// 信號類型/// </summary>public enum SignalType{Unknow,X01,X02,X03,X01_X02,X01_X03,X02_X03,X01_X02_X03}/// <summary>/// 回復信號前綴/// </summary>private static string singnalDefaultStart = Common.ConfigFileHandler.GetAppConfig("GetSerialPortDataDefaultSignal_StartPrefix");/// <summary>/// 回復信號后綴/// </summary>private static string singnalDefaultEnd = Common.ConfigFileHandler.GetAppConfig("GetSerialPortDataDefaultSignal_EndPrefix");/*-------------------------------------------------------------------------------------*//// <summary>/// 產品生命周期(計算時間)/// </summary>//private List<MachineProcedure> _MachineProcedureListForTime=null;/// <summary>/// 產品生命周期(計算次數)/// </summary>private List<MachineProcedure> _MachineProcedureListForCount=null;/// <summary>/// 產品周期計數(生產數量)/// </summary>public int ProductCount = 0;/// <summary>/// 空產品周期計數(不完整[空啤]生產數量)/// </summary>public int ProductErrorCount = 0;/// <summary>/// 單次產品周期秒數/// </summary>public long LastProductUseMilliseconds = 0;/// <summary>/// /// </summary>public Nullable<DateTime> LastX03SignalGetTime = null;/// <summary>/// 上一個信號/// </summary>public SignalType LastSignal;/// <summary>/// 更新機器信號后更新界面的方法與委托/// </summary>/// <param name="signalType"></param>public delegate void UpdateMachineSignal(SignalType signalType);public UpdateMachineSignal UpdateMachineSignalDelegate;/*-------------------------------------------------------------------------------------*//// <summary>/// 構造函數,處理初始化的參數/// </summary>public MachineProduceStatusHandler(){//產品生命周期(計算時間)//_MachineProcedureListForTime = new List<MachineProcedure>();//產品生命周期(計算次數)_MachineProcedureListForCount = new List<MachineProcedure>();}/*-------------------------------------------------------------------------------------*//// <summary>/// 更新信號方法/// </summary>/// <param name="newSingnal">新信號</param>public void ChangeSignal(string newSingnal){string convertSingnalString = ConvertSingnalString(newSingnal);//判斷是正常的信號if (!string.IsNullOrEmpty(convertSingnalString)){//判斷X信號SignalType convertSingnalStatusType = ConvertSingnalStatus(convertSingnalString);if (convertSingnalStatusType != LastSignal){#region 與上一次信號不同if (convertSingnalStatusType == SignalType.X03){#region 自動信號(區分上一個信號)_MachineProcedureListForCount.Add(new MachineProcedure(){ProcedureID = convertSingnalString,ProcedureCode = convertSingnalStatusType.ToString(),ProcedureName = "自動",});if (LastSignal == SignalType.X01_X03){//結束產品周期并計時if (LastX03SignalGetTime.HasValue){LastProductUseMilliseconds = (System.DateTime.Now - LastX03SignalGetTime.Value).Milliseconds;}LastX03SignalGetTime = System.DateTime.Now;}else if (LastSignal == SignalType.X02_X03){//必須包含完整的生命周期才計數if (CheckHaveRealProduceProcess(_MachineProcedureListForCount)){//計數ProductCount++;_MachineProcedureListForCount.Clear();_MachineProcedureListForCount.Add(new MachineProcedure(){ProcedureID = convertSingnalString,ProcedureCode = convertSingnalStatusType.ToString(),ProcedureName = "自動",});}}#endregion}else if (convertSingnalStatusType == SignalType.X01_X03 || convertSingnalStatusType == SignalType.X02_X03){#region 開模完成==射膠完成(不區分上一個信號)//產品生命周期(計算數量)if (_MachineProcedureListForCount != null && _MachineProcedureListForCount.Count > 0){//信號string procedureNameString = string.Empty;if (convertSingnalStatusType == SignalType.X01_X03) procedureNameString = "開模完成";else if (convertSingnalStatusType == SignalType.X02_X03) procedureNameString = "自動射膠";_MachineProcedureListForCount.Add(new MachineProcedure(){ProcedureID = convertSingnalString,ProcedureCode = convertSingnalStatusType.ToString(),ProcedureName = procedureNameString,});}#endregion}#endregion//上一個信號LastSignal = convertSingnalStatusType;//根據信號更新界面 UpdateMachineSignalDelegate(LastSignal);}}}/// <summary>/// 匹配信號是否正常/// 并返回信號中的模式數字/// </summary>/// <param name="inputSingnal">原信號</param>/// <returns></returns>private string ConvertSingnalString(string inputSingnal){Regex regex = new Regex("^" + singnalDefaultStart + "[a-fA-F0-9]{4}" + singnalDefaultEnd + "$");Match match = regex.Match(inputSingnal);if (match.Success){Regex regexMiddle = new Regex("(?<=(" + singnalDefaultStart + "))[.\\s\\S]*?(?=(" + singnalDefaultEnd + "))", RegexOptions.Multiline | RegexOptions.Singleline);Match matchMiddle = regexMiddle.Match(inputSingnal);return matchMiddle.Value;}else{return null;}}/// <summary>/// 模式數字轉換為X[]信號/// </summary>/// <param name="inputSingnal">模式數字[0800,0400,0200,0C00,0A00,0600,0E00等模式數字]</param>/// <returns></returns>private SignalType ConvertSingnalStatus(string inputSingnal){if (inputSingnal == "0800") return SignalType.X01; //開模終止信號else if (inputSingnal == "0400") return SignalType.X02;//射膠信號else if (inputSingnal == "0200") return SignalType.X03;//自動運行模式信號else if (inputSingnal == "0C00") return SignalType.X01_X02;else if (inputSingnal == "0A00") return SignalType.X01_X03;else if (inputSingnal == "0600") return SignalType.X02_X03;else if (inputSingnal == "0E00") return SignalType.X01_X02_X03;else return SignalType.Unknow;}/// <summary>/// 判斷是否是真實的生產流程/// </summary>/// <param name="oldMachineProcedureList"></param>/// <returns></returns>private bool CheckHaveRealProduceProcess(List<MachineProcedure> oldMachineProcedureList){bool resultFlag = false;bool isX01_X03 = false;bool isX02_X03 = false;bool isX03 = false;//判斷是否有完整的信號foreach (var processItem in oldMachineProcedureList){if (processItem.ProcedureCode == SignalType.X01_X03.ToString()) isX01_X03 = true;if (processItem.ProcedureCode == SignalType.X02_X03.ToString()) isX02_X03 = true;if (processItem.ProcedureCode == SignalType.X03.ToString()) isX03 = true;}//完整的信號則算正常生產流程if (isX01_X03 && isX02_X03 && isX03) resultFlag = true;return resultFlag;}} }

?

?以上方法是可以正常從類內部更新winform界面的

?

轉載于:https://www.cnblogs.com/weschen/p/10183685.html

總結

以上是生活随笔為你收集整理的c#后台线程更新界面的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91丨九色丨黑人外教 | 老司机深夜福利网站 | 欧美另类精品 | 大吊av| 日本女人黄色 | 亚洲第一大综合区 | 海角社区在线视频播放观看 | 国产精品网站入口 | 欧美一区二区日韩 | 日本波多野结衣在线 | 一级黄色片网站 | av中文字 | av中字| 欧美综合国产 | 久久精品视频网站 | 欧美第一页在线观看 | 亚洲一区二区久久久 | 欧美午夜一区二区 | 人人干超碰 | 成人综合区 | 日韩免费中文字幕 | 伊人色综合久久久 | 性欧美ⅴideo另类hd | 蜜桃视频一区二区在线观看 | √天堂资源在线 | 少妇精品视频一区二区 | 精品无码人妻一区二区三区品 | 亚洲在线观看一区二区 | 国产不雅视频 | 深夜福利免费在线观看 | 94av| 中国一级特黄毛片大片 | 亚洲成人自拍网 | 国产成人精| 少妇极品熟妇人妻无码 | 亚洲国产精品视频在线 | 国产宾馆自拍 | 99精品久久久久久中文字幕 | 美日毛片| 国产在线久久久 | www好男人| 特黄一区二区 | 91调教打屁股xxxx网站 | 日韩欧美在线免费观看 | 中国黄色片子 | 绿色地狱在线观看 | 日韩一区欧美二区 | www奇米影视com | 手机看片欧美日韩 | 国产成人欧美一区二区三区的 | 插我一区二区在线观看 | 一区二区三区视频播放 | 97香蕉超级碰碰久久免费软件 | 欧美激情一区二区三级高清视频 | 欧美激情久久久久久 | 成人av网站在线 | 农民人伦一区二区三区 | 中文字幕22页 | 精品国产一区二区三区在线 | 国模私拍视频在线 | 亚洲天堂五月天 | 日韩人妻精品中文字幕 | 国产经典一区二区三区 | 午夜成年人 | 色老头免费视频 | 夜夜操女人 | 九九热免费视频 | mm131丰满少妇人体欣赏图 | 亚洲AV午夜福利精品一级无码 | 天天插夜夜操 | 日韩精品中文字幕在线播放 | 日韩 国产| 黄色小说在线免费观看 | 91成人免费在线视频 | 国产色无码精品视频 | 精品一区二区中文字幕 | 精品少妇一区二区三区在线观看 | 国产亚洲综合在线 | 26uuu精品一区二区 | 日本免费一区二区三区最新 | 高潮流白浆在线观看 | 深夜福利日韩 | 欧美揉bbbbb揉bbbbb | 一区二区三区免费在线视频 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 干爹你真棒插曲免费 | 国产精品123区 | 拔插拔插华人 | youjizz麻豆| 日韩欧美精品中文字幕 | 夜夜精品一区二区无码 | 麻豆黄色网| 欧美激情精品久久久久久 | 日本一区二区三区在线观看 | 在线激情 | 人人插人人澡 | 国产农村av| 青青草这里只有精品 | 爱爱一区二区三区 |