前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >子线程调用UI线程的方法

子线程调用UI线程的方法

作者头像
用户1075292
发布2018-01-23 14:39:01
1.1K0
发布2018-01-23 14:39:01
举报
文章被收录于专栏:听雨堂听雨堂

vs2005中,子线程不允许使用UI中的控件,网上的解决方法都有:使用控件的Invoke,不过在我自己的应用中总觉得麻烦:我要从子线程中调用一个主线程中的处理,要用一次委托,而Invoke还要用委托,绕来绕去,把人绕的很晕。我稍微改了一下结构,可以比较方便的达到在子线程中调用UI线程中的处理函数。

在线程类中,定义

public delegate void ReceivedHandlerUI(object obj);     //接收处理,涉及UI

使用两个变量,第二个只要是界面中的任意控件都行,主要是利用它回到UI线程

public ReceivedHandlerUI OnReceivedUI;  //接收处理函数,涉及UI
public System.Windows.Forms.Control UICtrol;  //界面中的任意控件

关联的方法

public void SetReceivedUserUI(ReceivedHandlerUI rh, System.Windows.Forms.Control ctl)
{
    OnReceivedUI = rh;
    UICtrol = ctl;
}  

子线程中需要调用UI中的处理:

if (OnReceivedUI != null && UICtrol != null)
{
    UICtrol.Invoke(OnReceivedUI, state);
}    

---------------------------------------------

UI中处理,往往会变化,但只要这么做

threadobj.SetReceivedUserUI(new ReceivedHandlerUI(MyReceivedHandlerUI), this);
//界面处理
void MyReceivedHandlerUI(object obj)
{
    LineInfo li = (LineInfo)obj;
    textBox2.Text +=  "收到数据:" + li.RetrieveFromBuffer()+"\r\n";
}  

我的程序中,子线程的处理相对稳定,主界面中的处理反而相对变化,这种处理方式,可以很快的写出需要的处理程序,可以使用任意控件。同时,由于是在UI线程中执行,所以操作控件时也不用考虑并发性线程安全之类的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010-07-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档