UI线程外部线程调用UI控件简易处理方法

By | 05月01日
Advertisement

假如我们有一个WinForm对象,其中有一个Text标签需要根据其他线程传过来的参数改变显示参数的值。

改变Text标签的方法是:

private void ChangeText(string text)

{

this.Text = "参数是:" + text;

}

由于ChangeText的参数text是另外线程(假设是线程A)传送过来的,那么ChangeText方法就得作为线程A的一个事件对应的委托的签名方法。

A.ChangeTexted += new CbSimpleString(ChangeText);

其中CbSimpleString是带1个string参数的委托,自定义类型代码为:public delegate void CbSimpleInt(string s);

运行时,由线程A发出ChangeTexted事件来调用UI线程内部的方法 ChangeText修改Text标签值是不能直接调用的。因为大多数控件是不支持创建控件以外线程调用的。当前对象有一个属性值是this.InvokeRequired就是用来指示调用方在对控件调用时是否必须调用Invoke方法(也就是阻塞调用,必须处理完了才能往下进行)。所以当我们需要外部线程来调用必须调用Invoke方法的控件时,就得采用以下方式,把它进行一些转变。

private void ChangeText(string text)

{

if(this.InvokeRequired)

{

object[] args = { val };

this.Invoke(new CbSimpleString(this.ChangeText), args);

}

else

{

this.Text = "参数是:" + text;

}

}

其实很简单,就是把外部线程调用方法时先进行控件是否必须调用Invoke方法判断,如果其不支持外部线程直接调用,那么就把在使用Invoke方法调用一次,把外部线程传过来的参数放在Invoke方法的参数列表里。

Similar Posts:

  • 在内容页中调用母版页控件 一些方法总结

    总结来源百度贴吧 在内容页中调用母版页控件 在内容页中有个属性Master,可以通过它访问母版页.如我们要修改母版页上的标题,我们看到显示标题的那个Label的ID为Label1,在Page_Load事件中增加以下代码: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) ((Label)Master.FindControl("Label1")).Text = "标题被修改了!&quo

  • ASP.NET 调用打印机控件的方法 IEWebBrowser这个组件

    我对IEWebBrowser这个组件的execWB方法整理了一下﹐希望对大家有所帮助. 1. <object id="WebBrowser" width=0 height=0 classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object> 2. 调用方法. WebBrowser.ExecWB nCmdID, nCmdExecOpt, [pvaIn], [pvaOut] 3. 参数说

  • 如何跨越线程调用窗体控件?(2)

    一.前言 VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序.在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速.那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息. 二.使用Invoke 引用:http://dev.tot.name/csharp/html/20090314/20090314234018.htm 在Visual Studio 2005

  • C#子线程更新UI控件的方法实例总结

    本文实例总结了C#子线程更新UI控件的方法,对于桌面应用程序设计的UI界面控制来说非常有实用价值.分享给大家供大家参考之用.具体分析如下: 一般在winform C/S程序中经常会在子线程中更新控件的情况,桌面程序UI线程是主线程,当试图从子线程直接修改控件属性时会出现"从不是创建控件的线程访问它"的异常提示. 跨线程更新UI控件的常用方法有两种: 1.使用控件自身的invoke/BeginInvoke方法 2.使用SynchronizationContext的Post/Send方法更

  • WinForm中新开一个线程操作窗体上的控件(跨线程操作控件)GOOD

    http://www.cnblogs.com/joey0210/p/3450379.html 最近在做一个winform的小软件(抢票的...).登录窗体要从远程web页面获取一些数据,为了不阻塞登录窗体的显示,开了一个线程去加载数据远程的数据,会报一个错误"线程间操作无效: 从不是创建控件"lbl_loading_msg"的线程访问它."百度一下,原来从.net framework 2.0开始,为了安全,不允许跨线程操作控件.解决办法如下: 1.先声明一个拥有委托

  • 编写windows服务中调用activeX控件(SDK)的心得

    程序目的: 用windows服务程序调用activeX控件(二次封装过),达到服务启动时开始录制影音(不需要用窗体显示出来),服务结束时录制结束 . 遇到问题: activeX控件必须加System.Windows.Forms; 而windows服务程序没有,引进来后就会出很多错误. 比如在new一个activeX实例时 " 当前线程不在单线程单元中,因此无法实例化 ActiveX 控件"3c33f325-cd56-4005-9e34-d0c6ab70b1eb". 这个问题很

  • 在MFC下调用WPF控件的总结

    为了在原有MFC程序上支持WPF的Ink功能,看了N天的.Net相关知识.我的机器上,开发环境实在是令人发指,如果有人碰到了我现在的问题,希望这篇文章能够对他有所帮助. 我安装了Visusal Studio 2005,.Net Framework 2.0, 3.5, 以及不知道啥时候装的3.0版本(我怀疑是安装3.5时候带进来的版本).在我的2005的开发环境里面,找不到WPF的模版.去网上搜索,说是需要安装2005的一个extension for wpf.我很辛苦的找到了这个extension

  • 关于VBS调用MSWinsock控件

    Windows脚本可以调用MSWinsock控件获得比较强大的网络访问能力,但那个106KB的mswinsck.ocx(V6.0.89.88)不是系统自带的,这使得该控件的实用性大打折扣.而且,脚本要调用MSWinsock还必须克服一个困难. 以"MSWinsock"为关键字,使用百度搜索网页,可以获得至少3个VBS调用MSWinsock控件的例子:获取本机IP.端口扫描和发在"黑防"的<VBS+MSWinsock打造灵巧UDP后门>.但是,当你下载并注

  • Object标签调用控件,注册表查找控件classid方法

    1.打开注册表: 2.打开 HKEY_CLASSES-ROOT / CLSID : 3.选中CLSID,点击右键: 4.选择查找,勾选选项:数据,输入控件名称,例如搜索media: 5.点击查找: 这时会看到搜索结果为:{00022601-0000-0000-C000-000000000046},括号内的字符串就是clsssid. 在Html 中写上object标签,如下: <OBJECT classid="clsid:00022601-0000-0000-C000-00000000004

  • VC 怎样调用COM控件的接口函数

    -------------------------------- COM库函数 -------------------------------- 利用COM库函数使用代码组件的方法是本文介绍的三种方法中实现起来最麻烦和困难的方法.它要求开发人员必须具有对COM原理的深入理解.该方法实现步骤如下: 1. 首先添加COM初始和终止代码.在应用程序类的初始化实例函数InitInstance()中添加如下代码: CoInitialize(NULL); -- CoUnInitialize(); 上述语句运

Tags: