首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

对 Windows 窗体控件开展线程安全调用

2012-12-23 
对 Windows 窗体控件进行线程安全调用今天在编写一个windows应用程序的时候碰到了一个小问题,程序需求是这

对 Windows 窗体控件进行线程安全调用

今天在编写一个windows应用程序的时候碰到了一个小问题,程序需求是这样的,创建多个线程调用执行某个方法,Windows?Form中有个Progress?Bar控件用于显示已经执行完毕的进程数,即当所有的线程都运行完毕后,Progress?Bar的进度也到头了。先给出初步的实现方式:

//未给出代码的部分没有变化private delegate void SafeSetProgressBarValue(int v);//线程执行完毕后回调public void OnThreadExit(){    count++;    OnSafeSetValue(count * 10); //使用线程安全的代码设置ProgressBar的进度    //判断是否全部进程已结束    if (count == n)    {        MessageBox.Show("所有线程已执行完毕!");        ClearState();    }}/// <summary>/// 线程安全的修改ProgressBarValue方式。/// </summary>/// <param name="va"></param>private void OnSafeSetValue(int va){    if (this.progressBar1.InvokeRequired)    {        SafeSetProgressBarValue call = delegate(int v) { this.progressBar1.Value = v; };        this.progressBar1.Invoke(call, va);    }    else        this.progressBar1.Value = va;}

?

说明

Windows?窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个?Invoke?方法来将调用封送到适当的线程。该属性可用于确定是否必须调用?Invoke?方法,当不知道什么线程拥有控件时这很有用。控件上有四种方法可以安全地从任何线程进行调用:Invoke、BeginInvoke、EndInvoke?和?CreateGraphics。对于所有其他方法调用,当从另一个线程进行调用时,应使用这些?Invoke?方法之一。?

Control.InvokeRequired?属性?

获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用?Invoke?方法,因为调用方位于创建控件所在的线程以外的线程中。?

属性值?

如果控件的?Handle?是在与调用线程不同的线程上创建的(说明您必须通过?Invoke?方法对控件进行调用),则为?true;否则为?false。?

更多资料:?

http://msdn2.microsoft.com/zh-cn/library/ms171728(VS.80).aspx?

http://msdn2.microsoft.com/zh-cn/library/system.windows.forms.control.invokerequired(VS.80).aspx?

http://blog.csdn.net/joem/archive/2006/12/18/1448198.aspx

热点排行