C#创建子线程,子线程使用委托更新控件
一、背景
由于在窗体程序中通过点击一个button按键后需要更新TreeView控件的内容,由于等待时间比较长,主程序无法一起在那边等待,需要去处理其它的事情,所以就需要创建新的子线程来处理。因为主线程主要用于窗体程序的更新,但子线程又存在问题是C#中禁止跨线程直接访问控件,所以子线程中要更新窗体程序的控件要使用委托主线程来处理更新控件。
二、程序分析
using System.Threading; //声明线程命名空间
private void Updatebutton_Click(object sender, EventArgs e) //按键控件处理程序
{
Thread SearchDevice = new Thread(FindCanDevice); //子线程的创建
if (update_flag ==false) //开始更新网络设备
{
update_flag =true;
UpdateprogressBar.Maximum= 127; //总共会查询126个设备
DevicetreeView.Nodes.Clear(); //快速清空TreeView的内容
NodeList = new TreeNode("Device List", 0, 0);
this.DevicetreeView.Nodes.Add(NodeList); //加入根节点
//Thread SearchDevice = new Thread(FindCanDevice);
SearchDevice.IsBackground = true; //当主线程关闭时,子线程也随着关闭
SearchDevice.Start(); //子线程启动
}
else //停止更新网络设备
{
update_flag = false;
}
}
private void FindCanDevice() //子线程处理程序
{
int ret; //寻找设备的状态
int countnum = 0;
for (int j = 1; j < 128; j++)
{
if (!update_flag) //退出网络设备的更新
break;
countnum++;
ret = GloableVar.WzCanOpenUpdateNetwork(j);
ShowDevice(ret, j, countnum);
}
}
public delegate void aa(int flagSuccess, int data, int count); //委托类型的说明
private void ShowDevice(int flagSuccess, int data, int count)
{
if(this.InvokeRequired) //判断是不是控件所在线程调用的,不是的话为true,Invoke用于跨线程调用控件进行操作
{
aa a = new aa(ShowDevice); //定义委托的函数
this.Invoke(a, new object[] { flagSuccess, data, count }); //指定用主线程中的控件去调用这个委托,相当于主线程来执行这个函数
}
else
{
if(flagSuccess== 0)
{
TreeNode NodeDevice = new TreeNode("Node ID " + data.ToString());
NodeList.Nodes.Add(NodeDevice); //加入子节点
DevicetreeView.ExpandAll(); //展开所有的节点
}
UpdateprogressBar.Value = count;
}
}
1、 Thread SearchDevice = new Thread(FindCanDevice)为新建的子线程,子线程的处理函数为void FindCanDevice() ,完成线程创建后需要启动线程 SearchDevice.Start(),线程才会运行。
2、在进入子线程处理函数后,如果因为控件是主线程创建的,子线程不是控件所在的线程调用,所以this.InvokeRequired一直为true,进入判断程序后通过this.Invoke将子线程的处理委托给主线程去处理,由于委托的函数为ShowDevice并且当前调用执行的线程为控件所在的主线程调用,这时又判断this.InvokeRequired为false,所以执行控件的更新处理
if(flagSuccess== 0)
{
TreeNode NodeDevice = new TreeNode("Node ID " + data.ToString());
NodeList.Nodes.Add(NodeDevice); //加入子节点
DevicetreeView.ExpandAll(); //展开所有的节点
}
UpdateprogressBar.Value = count;
三、参考文档
http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html //线程的创建
http://www.cnblogs.com/songxingzhu/p/3677307.html //InvokeRequired和Invoke的使用
by 羊羊得亿
2017-07-04 ShenZhen
C#创建子线程,子线程使用委托更新控件的更多相关文章
- [转]MFC子线程中更新控件内容的两种办法
一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...
- Winfrom 如何安全简单的跨线程更新控件
来源:http://www.cnblogs.com/rainbowzc/archive/2010/09/29/1838788.html 由于多线程可能导致对控件访问的不一致,导致出现问题.C#中默认是 ...
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...
- C# 通过委托控制进度条以及多线程更新控件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- QT 创建一个具有复选功能的下拉列表控件
最近研究了好多东西,前两天突然想做一个具有复选功能的下拉列表框.然后在网上"学习"了很久之后,终于发现了一个可以用的,特地发出来记录一下. 一.第一步肯定是先创建一个PROJECT ...
- VB.NET章鱼哥出品—怎样解决MDI子窗口被父窗口中的控件覆盖的问题
近期有个网友问我这个问题,我就上网搜了下,结果非常失望.有几个在CSDN上发的求助帖.看到最后都没有找到明白的答案. 这里笔者在网上找到了API函数SetParent(),并对网上的错误进行了改动,并 ...
- AE二次开发,解决子窗体使用父窗体的AxControl控件
在子窗体写构造函数,然后再在父窗体按钮点击事件下写 public frmIDW(AxMapControl axMapControl1) { InitializeComponent(); this.ax ...
- iOS代码实现:创建按钮,绑定按钮事件,读取控件值
// // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright (c) 2014年 lishujun. All rig ...
- C#子线程更新UI控件的方法总结
http://blog.csdn.net/jqncc/article/details/16342121 在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从 ...
随机推荐
- ios svn repository
xcode默认自带Git和svn,首先讲下xcode4.6.3下配置svn: 1.检測你的mac中是否安装了svn: (1) 打开终端,输入 svn --version 假设出现下图信息,则说明已经安 ...
- 《Android编程权威指南》PhotoGallery应用梳理
PhotoGalley是<Android编程权威指南>书中另外一个重要的应用.
- 23.IDEA 运行junit单元测试方法
转自:https://blog.csdn.net/weixin_42231507/article/details/80714716 配置Run,增加Junit 最终配置如下:
- HDU 2435 There is a war Dinic 最小割
题意是有n座城市,n号城市不想让1号城市可达n号,每条道路有一条毁坏的代价,1号还可以修一条不能毁坏的道路,求n号城市所需的最小代价最大是多少. 毁坏的最小代价就直接求一遍最大流,就是最小割了.而可以 ...
- SQLServer 查询最近一天,三天,一周,一月,一季度数据的方法
三天 select * from T_news where datediff(day,addtime,getdate())<= 2 and datediff(day,addtime,getdat ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...
- ZOJ 1654 Place the Robots(放置机器人)------最大独立集
Place the Robots http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1654 Time Limit: 5 Sec ...
- Java编程思想(四) —— 复用类
看了老罗罗升阳的专訪,不由自主地佩服,非常年轻,我之前以为和罗永浩一个级别的年龄.也是见过的不是初高中编程的一位大牛之中的一个,专訪之后.发现老罗也是一步一个脚印的人. 别说什么难做,做不了.你根本就 ...
- Swift Standard Library Reference.pdf
Swift Standard Library Reference.pdf 下载地址 http://download.csdn.net/detail/swifttrain/7446331 自己的Mark ...
- java 链接server上的 mongodb 出现 connect time out 问题
异常信息 十二月 22, 2014 5:27:58 下午 com.mongodb.DBTCPConnector initDirectConnection 警告: Exception executing ...