`

SWT 同步和异步

 
阅读更多
刚开始使用swt的人肯定会经常遇到org.eclipse.swt.SWTException : invalid thread access这样的事情。什么时候会出现这个Exception呢?
看一下org.eclipse.swt.widgets.Widget.checkWidget()方法就大概知道是什么原因了。源代码如下:

if (display.thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);

其中的display.thread指的就是创建该display对象的线程。swt在该线程中不仅创建Display,而且还组建, 显示各个widget,以及Receive Message From Operation System .
和调用对应的Listener。然而很多事情都用单线程来处理的话,必然会带来很多的问题。比如如果一个listener有很多的事情要做,花的时间很长,假设要1个小时,那么该线程下面的操作就需要等待一个小时才能够处理,这显然是用户所不能够接受的。为了解决这一点,swt在Display中提供两个方法让其他的线程中有机会操作UI的widget.

这两个方法就是: syncExec(Runnable runnable)(同步); 和 asyncExec(Runnable runnable)((异步):);

举一个例子:
display.syncExec(
new Runnable() {
  public void run(){
   label.setText(text1);
  }
}
);

这段程序是在non user interface thread中执行的。如果直接写成:
label.setText(text);那么就会导致invalid thread access exception。

同样也可以使用第二个方法:
display.asyncExec(
new Runnable() {
  public void run(){
   label.setText(text2);
  }
}
);

疑问一:这两个方法有什么不一样的地方?
答案是:这两个方法的执行只会对执行此方法的线程造成影响。
具体说来,设定 创建 display(也即user interface thread)的线程名为T1, 而执行display.syncExec的线程名为T2, 执行display.asyncExec的线程名为T3;
1)参数Runnable里边的run方法中label.setText(text);的执行都是在T1中执行的。(回调的巧妙)
2)T2在执行display.syncExec方法的时间点设为t0, T1在执行label.setText(text1)的时间点是t1, T2的display.syncExec方法结束的时间点是t2
那么t0,t1,t2时间点先后的顺序是:t0<t1<t2.理解这一点很重要,简单一句话来形容就是display.syncExec的执行需要等到别的线程执行完毕,回调方法才结束。  
分享到:
评论

相关推荐

    swt线程冲突与解决

    通过对SWT线程冲突的理解以及对同步调用和异步调用的掌握,我们可以有效地避免在多线程环境中对SWT组件的非法访问,从而提高程序的稳定性和用户体验。在实际开发过程中,根据具体的业务需求选择合适的调用方式是非常...

    SWT并发例子(后台耗时线程)

    SWT(Standard Widget ...这涉及到对Java多线程的理解,以及如何在SWT环境中正确地在事件调度线程和后台线程之间切换,以处理UI更新和耗时任务。通过这种方式,我们可以构建出高效且用户体验良好的桌面应用程序。

    使用swt开发的程序用于web上

    1. **异步通信**:Web应用通常基于HTTP协议,因此需要处理异步数据请求和响应,而SWT中的交互通常是同步的。GWT提供XMLHttpRequest(XHR)和GWT-RPC服务来处理这一问题。 2. **用户体验**:Web应用的界面更新通常...

    swt sqlserver分页组件

    6. ** 数据绑定**:使用SWT的Data Binding Support (DBS) 或JFace Data Binding可以简化数据模型与UI之间的同步,使得分页操作更加直观。 7. ** UI 设计**:在用户界面上添加页码导航按钮,以及每页记录数的选择器...

    SWT线程教程

    SWT的设计原则之一是为了提高程序的安全性和响应速度,它不允许非UI线程直接访问或修改UI组件。这意味着所有的UI更新必须发生在UI线程(UI Thread)中,也被称为Display线程(Display Thread)。这样的设计有助于避免...

    swt 多线程

    在开发SWT应用程序时,尤其是在RCP(Rich Client Platform)环境中,多线程处理是常见的需求,以确保用户界面的响应性和程序的高效性。本文将深入探讨SWT中多线程的使用,特别是与UI交互相关的多线程原理。 首先,...

    局域网聊天 SWT Java 多线程问题已经解决

    本主题将深入探讨如何利用SWT(Standard Widget Toolkit)和Java来构建一个局域网内的聊天应用,并解决其中涉及的多线程问题。SWT是Eclipse基金会提供的一个开源GUI库,它为Java开发者提供了与操作系统更紧密集成的...

    SWT Tree 完整的树例子源码

    本教程将通过一个完整的SWT Tree实例,帮助新手理解如何创建、操作和自定义SWT Tree。 首先,我们来分析给定的文件列表: 1. `otree.css`: 这个文件是CSS样式表,用于定义SWT Tree的外观和布局,如字体、颜色、...

    SWT综合教程及安装指导

    1. GUI线程:在SWT中,所有对GUI的操作必须在事件调度线程(Event Dispatch Thread,EDT)中进行,以保证界面的同步更新和避免数据竞争。 2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在...

    SWT API 资料

    SWT支持数据绑定,允许控件的值与应用程序中的数据模型进行同步。这在复杂的用户界面设计中非常有用,可以减少代码量并提高可维护性。模型驱动设计(MVC或MVVM模式)可以更好地分离视图、控制逻辑和数据模型。 ### ...

    ObligatoriskOpg2SWT

    8. **线程处理**:由于GUI操作通常需要在主线程中执行,理解线程同步和异步编程的概念以避免界面冻结。 9. **异常处理**:添加适当的错误处理代码,确保程序的健壮性。 10. **调试和测试**:学会使用Visual Studio或...

    Swing应用 介绍

    这一设计是为了确保界面的同步性和确定性,防止不同线程同时修改组件状态导致的不确定行为。在单线程模型中,开发者需要注意不要在事件处理函数中执行耗时任务,因为这会导致 EDT 被阻塞,使得用户界面无响应。为了...

    swt-starter-pwa-v2

    JavaScript部分可能使用了Service Worker API来实现离线访问和后台同步数据,以及Web App Manifest文件来定义应用在安装到主屏幕后的表现。 2. **配置文件**:可能有package.json,记录了项目的依赖库、版本信息和...

    javase中常用范例

    线程同步(如`synchronized`关键字,`wait()`, `notify()`, `notifyAll()`方法),线程池(`ExecutorService`,`ThreadPoolExecutor`),以及使用`Callable`和`Future`进行有返回值的异步任务。 6. **异常处理**: ...

    rcp收集资料上传

    在实际项目中,这些操作可能会更加复杂,涉及到更多细节和优化,如异步处理、多线程、UI更新同步等问题。如果要深入学习RCP开发,还需要掌握Eclipse插件开发、SWT/JFace UI组件、模型-视图-控制器(MVC)设计模式等...

    Eclipse插件开发

    - SWT(JFace)是Eclipse图形用户界面的核心组件,提供了一套丰富的UI控件和事件处理机制。 - 类库结构、资源管理、多线程访问GUI资源等是理解SWT的关键点。 - **3.2 SWT疑难点解析** - Button、Text、Table等控件...

    飞思卡尔5634M单片机文档

    - **软件看门狗定时器(SWT)**:监控程序运行状态,防止死机。 - **调试特性**:支持JTAG等调试接口,便于开发调试工作。 #### 五、内存映射 - **概述**:这部分介绍了MPC5634M的内存布局,包括各种存储区域的位置...

Global site tag (gtag.js) - Google Analytics