zoukankan      html  css  js  c++  java
  • 跨线程访问窗体控件

    跨线程访问窗体控件

    左直拳

     

    我写了一个函数,里面访问到了窗体上的控件。

    看起来没有什么问题。

    然后开启了一个线程,让它执行此函数。结果运行时报错:跨线程访问窗体控件,在非创建该控件的线程上试图访问该控件。

    后来查了帮助,才知道怎么一回事。帮助说:

    访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安全方式访问控件非常重要。

    怎样才算安全?

    在给控件赋值或设置前,先看看方法调用时是否必须调用 Invoke 方法。

    Windows 窗体中的控件被绑定到特定的线程,不具备线程安全性。因此,如果从另一个线程调用控件的方法,那么必须使用控件的一个 Invoke 方法来将调用封送到适当的线程。该属性可用于确定是否必须调用 Invoke 方法,当不知道什么线程拥有控件时这很有用。

    //委托

    delegate void SetEnableCallback(System.Windows.Forms.Control objCtrl, bool enable);

     

    //声明

    private void _SetText<TObject>(TObject objCtrl, string text)

    where TObject : System.Windows.Forms.Control

    {

    if (objCtrl.InvokeRequired)

       {

           SetTextCallback d = new SetTextCallback(_SetText);

           this.Invoke(d, new object[] { objCtrl, text });

       }

       else

       {

           objCtrl.Text = text;

       }

    }

     

    //调用

    public int TotalNum

    {

    set { _SetText<TextBox>(this.txt_Total, value.ToString()); }

    }

     

    有关具体内容,请查阅帮助如何:对 Windows 窗体控件进行线程安全调用

     
  • 相关阅读:
    POJ1006: 中国剩余定理的完美演绎(非原创)
    poj 1001 分析
    document.createElement()的用法
    js innertext
    转csdn-css4
    css中最基本几个选择器
    Django解决(1146, "Table 'd42.django_session' doesn't exist")方法
    django清理migration终极解决办法
    linux中的fork炸弹
    nginx转发php文件到php-fpm服务器提示502错误
  • 原文地址:https://www.cnblogs.com/leftfist/p/4258299.html
Copyright © 2011-2022 走看看