zoukankan      html  css  js  c++  java
  • 在界面的子线程中操作界面控件

         通常,会有这样的需求与问题:运行了一个窗体,触发某个事件后需要做一些处理,而这个处理可能比较耗时间或者耗资源,如果直接在消息响应中处理,运行起来界面会假死。这个时候,我们想到了多线程,新建一个子线程来处理这个过程,然后将处理的结果告诉界面线程,并在界面上体现出来给用户看。这样就出现了一个问题,子线程显示结果给用户时,需要操纵界面线程管理的控件,而当子线程没有释放这个控制时,控件也会出现假死,因为界面线程不能及时绘制控件了。

         处理方法:使用委托,将子线程操作控件的部分委托给界面线程去做。

    例子

    通常的实现如下: 

    代码
    1 private void queryButton_Click(object sender, EventArgs e)
    2 {
    3
    4 Thread queryThread = new Thread(new ThreadStart(query));
    5
    6 queryThread.start();
    7
    8 }
    9
    10  private void query()
    11 {
    12
    13 queryTextbox.text = "queryThread result";
    14
    15 }

    修正:

    代码
    1 //1.增加一个
    2  delegate void queryFunDelegate();
    3
    4  //2.新加一个函数
    5 private void sinvoke()
    6
    7 {
    8
    9 this.Invoke(new queryFunDelegate(query));
    10
    11 }
    12
    13 //3.之后重新调用
    14 private void queryButton_Click(object sender, EventArgs e)
    15
    16 {
    17
    18 Thread queryThread = new Thread(new ThreadStart(sinvoke);
    19
    20 queryThread.start();
    21
    22 }
    23
    24 //4.处理函数
    25 private void query()
    26 {
    27
    28 queryTextbox.text = "queryThread result";
    29
    30 }
  • 相关阅读:
    2019年11月28日开发手记
    2019年11月26日开发手记
    2019年11月25日开发手记
    2019年11月24日开发手记
    2019年11月23日开发手记
    R学习
    python学习目录
    自动化测试appium
    python爬虫的进阶用法
    asyncio
  • 原文地址:https://www.cnblogs.com/njucslzh/p/1870401.html
Copyright © 2011-2022 走看看