参考文章《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#后台线程更新界面相关推荐

  1. wxpython后台如何更新界面信息_wxpython后台线程更新界面控件方法

    在大多数的GUI应用程序中,在应用程序的后台中长期执行一个处理过程而不干涉用户与应用程序的其它部分的交互是有好处的.允许后台处理的机制通常是产生一个线程并在该线程中长期执行一个处理过程.对于wxPyt ...

  2. wxpython后台线程更新界面控件方法

    http://blog.sina.com.cn/s/blog_56146dc501009ea9.html http://www.th7.cn/Program/Python/201303/128088. ...

  3. winform 后台线程更新UI

    //后台线程更新TextBoxprivate void SetTextBox(TextBox txt, string value){Action act = () =>{txt.Text = v ...

  4. Qt主线程和工作线程更新界面问题

    Qt在运行时会开启一个主线程,如果没有开启工作线程的话,所有界面上的操作都是在主线程,包括更新界面或者处理数据等操作.大家都知道如果处理数据比较多的话,最好是在单独开启一个线程来处理数据,这样就不会影 ...

  5. AndroidUI——后台线程更新UI的几种方式

    开发Android程序时经常会用到后台线程请求服务器数据,当请求完数据后更新UI时,经常遇到回调函数中和UI相关的语句无法执行,甚至有时候会抛异常. 下面的例子我会讲到三种方法更新UI,例子非常简单, ...

  6. Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面

    概述:每个Android应用程序都运行在一个dalvik虚拟机进程中,进程开始的时候会启动一个主线程(MainThread),主线程负责处理和ui相关的事件,因此主线程通常又叫UI线程.而由于Andr ...

  7. android 线程 界面,android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间 ...

  8. Android中Handler的使用方法——在子线程中更新界面

    本文主要介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Ha ...

  9. 开源WinForms界面开发框架Management Studio 选项卡文档 插件 Office 2007蓝色风格 后台线程...

    Management Studio是我在WinForms小项目开发过程中搭建起来的一个插件式结构的应用程序框架,因为简单灵活又容易扩展,现在将它开源供读者参考. 跑起来的效果图如下所示,具备选项卡式多 ...

最新文章

  1. 高频面试考点:Redis中有几百万数据量,如何进行高效访问?
  2. Nature:如何做一篇肠道菌群免疫的顶级文章
  3. AI 产品经理的三重门
  4. 在C#中用COM操作CAD
  5. 网上不知名的示波器方案记录
  6. python 画在同一坐标轴_Python学习第95课-多个数据在同一个坐标轴画图叠加
  7. PostgreSQL数据库的注入
  8. cifar10数据集测试有多少张图_基于特定数据集的Oracle、ClickHouse、ES测试报告
  9. 华人科学家量子计算机,华人科学家在美国研发出性能强大的光子计算机,能够与中国的量子计算机一战高下!...
  10. 高校学霸情侣 双双保研中科院,3年获近9万奖学金,120余项个人荣誉……
  11. c++中std::find_std :: find()与C ++中的示例
  12. 大战Java虚拟机【2】—— GC策略
  13. 【Kafka】Kafka NIO
  14. ubuntu12.04 java配置_Ubuntu 12.04 中安装和配置 Java JDK
  15. dta乱码_DTA是自动化索引的出色工具
  16. 计算机网络-01-计算机网络体系结构
  17. Apache Tomcat7.0 Tomcat7启动不了的解决问题
  18. 用Java开发数独游戏,源程序与源代码全部开放
  19. 实现导出excel,pdf功能
  20. 计算机四级大一能考吗,大一新生不让报考四六级?凭什么啊!!!

热门文章

  1. cordova项目怎样修改版本号
  2. 苍狼敏捷需求用例分析方法简介并讲义下载
  3. 应用营销策略知多少?
  4. 7-20上午刷题未知点集合
  5. python语音引擎深度学习_python深度学习之语音识别(speech recognize)
  6. The road to learning English-Listening
  7. 一步一步学ROP之Android ARM 32位篇
  8. mysql utc 下取得昨天的时间段。
  9. HTML5 Canvas 绘制旋转45度佛教万字
  10. 快速打开IIS的方法