zoukankan      html  css  js  c++  java
  • 子线程调用UI线程的方法

    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线程中执行,所以操作控件时也不用考虑并发性线程安全之类的。

  • 相关阅读:
    jvm系列(八):jvm知识点总览-高级Java工程师面试必备
    jvm系列(七):jvm调优-工具篇
    JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
    Java ClassLoader详解
    语言堆栈入门——堆和栈的区别
    kubernetes基本了解
    软编码和硬编码的理解
    前台页面传日期类型后台接收问题
    mybatis-plus简单了解
    二叉树基础知识
  • 原文地址:https://www.cnblogs.com/jetz/p/1779969.html
Copyright © 2011-2022 走看看