zoukankan      html  css  js  c++  java
  • 在SWT中非UI线程控制界面

    SWT作为一种桌面程序,一般存在两种线程,即UI线程和非UI线程。UI线程是负责生成窗口和控件的,还要负责监听事件的处理。在SWT中Display对象就是一个控制UI线程和其他线程之间的通信,负责管理队列中的事件。

    我是这样理解UI线程的:当程序启动后,控件监听事件先加载,若用户不进行任何操作,那么UI线程进入等待状态。若一旦触发某个事件,例如按钮的点击事件或者本文的输入事件等,此事件就进入事件队列中。此时UI线程就处理队列中的事件。等队列中的全部事件处理完毕,则恢复等待状态。处理事件的过程就是响应用户操作的过程。

    在SWT中,非UI线程不能直接操作UI控件,通常抛出的异常是:

    Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access

    这时,需要用通过Display对象的asyncExec(Runnable runnable)或syncExec(Runnable runnable)函数解决这个问题,更新界面。

    异步代码如:

     1 Display display = Display.getDefault();
     2 if (!display.isDisposed()) {
     3     if (display.readAndDispatch()) {
     4         Display.getDefault().asyncExec(new Runnable() {
     5             @Override
     6             public void run() {
     7                 //对控件的操作代码
     8             }
     9         });
    10     }
    11 }

    注意:这里display = Display.getDefault(),而不是调用getCurrent()。

    Display.getDefault()返回的是:最近的一个UI线程中Display实例,而Display.getCurrent()返回的是:当前线程中Display实例,若当前线程是非UI线程,则返回null。

  • 相关阅读:
    使用正则表达式验证密码长度
    创建字符串
    洛谷P1605 迷宫 深度搜索 模板!
    洛谷P5534 【XR-3】等差数列 耻辱!!!
    搜索字母a或A
    洛谷P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here
    19新生赛 质数中的质数
    洛谷P1055 ISBN号码
    洛谷P 1427 小鱼的数字游戏
    洛谷p1047 校门外的树
  • 原文地址:https://www.cnblogs.com/jeniss/p/3057884.html
Copyright © 2011-2022 走看看