`

swt的同步,异步处理中回调的运用[转]

    博客分类:
  • SWT
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的执行需要等到别的线程执行完毕回调方法才结束。

 

3)T3在执行display.asyncExec方法的时间点设为t0, T1在执行label.setText(text2)的时间点是t1,T3的display.asyncExec方法结束的时间点是t2,那么t0,t1,t2时间点先后的顺序是:t0<t1,t0<t2.但t1,t2前谁前谁后却不确定,理解这一点也很重要,简单一句话来形容就是display..asyncExec的执行不需要等到别的线程执行完毕才回来继续执行T3线程。

 

分享到:
评论

相关推荐

    swt-async-handler-1.0

    SWT同样不允许主线程外的其他线程直接访问控件。 所以SWT为我们提供了async执行Runnable的方法。...将在下一个版本中加入MessageQueue机制,实现多任务后台处理相应。 具体使用请参考test包下的Handler使用事例。

    用SWT写的文件同步程序

    标题中的“用SWT写的文件同步程序”表明这是一个利用SWT(Standard Widget Toolkit)开发的软件,主要用于实现本地文件的同步。SWT是Eclipse开源项目提供的一种Java GUI库,它提供了与操作系统底层更直接的交互,...

    swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位

    SWT(Standard Widget Toolkit)是Java编程环境中一个用于创建图形用户界面(GUI)的开源库,它是Eclipse项目的一部分。标题“swt-64.rar_64位swt_64的SWT_SWT64_swt.jar 64位_swt64位”表明这个压缩包包含了适用于...

    DJNativeSwing-SWT有关的所有jar,java将HTML页面转为图片

    标题中的"DJNativeSwing-SWT有关的所有jar,java将HTML页面转为图片"涉及到的是一个Java库,DJNativeSwing-SWT,它允许开发者在Java应用中集成Swing和 SWT(Standard Widget Toolkit)组件,并且能够将HTML页面转换...

    SWT插件中文教程SWT常用方法

    SWT(Standard Widget Toolkit)是Java编程环境中用于创建图形用户界面(GUI)的一种开源库,它是Eclipse项目的一部分...通过阅读这个中文教程,开发者能够深入理解SWT的工作原理,并能够熟练地运用到自己的项目中去。

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

    在SWT中,我们可以使用`Display.asyncExec`或`Display.syncExec`方法来在事件调度线程中执行代码,而使用`new Thread()`来创建并启动新的后台线程来执行耗时任务。以下是一个基本的示例: ```java Button button = ...

    SWT中文教程.rar

    SWT(Standard Widget Toolkit)是Java编程环境中一个用于创建图形用户界面(GUI)的开源库,它是Eclipse项目的一部分。本教程将深入讲解SWT的基本概念、组件使用以及实际开发中的应用技巧。以下是对SWT中文教程的...

    SWT源代码 SWT Source code

    - **组件模型**:SWT中的控件是如何组织和交互的,以及如何扩展自定义控件。 - **Java和C的混合编程**:SWT_AWT桥接的实现,如何在Java和C/C++之间传递数据和调用方法。 对于Eclipse插件开发者或希望深入理解GUI...

    在SWING、SWT中嵌入浏览器

    这篇博客文章“在SWING、SWT中嵌入浏览器”就探讨了如何在Java应用中实现这一功能。 首先,SWING是Java Foundation Classes (JFC)的一部分,提供了丰富的组件和布局管理器来构建复杂的用户界面。尽管SWING本身并不...

    SWT源码 swt.jar

    4. 良好的事件处理机制:SWT支持事件驱动编程,允许开发者响应用户的操作。 5. 跨平台:虽然SWT依赖于特定操作系统的库,但Eclipse项目提供了多个平台的版本,如Windows、Linux、Mac OS等。 在"swt-3.7.2-win32-win...

    swt/Jface中文教程

    此外,SWT还提供了强大的事件处理机制,使得开发者可以轻松地响应用户的交互行为。 - **JFace简介**:JFace建立在SWT之上,提供了一系列的工具和服务,旨在简化GUI的开发过程。它包括了对话框管理器、视图管理器、...

    SWT 中嵌入Word 控件应用

    这篇博客"SWT中嵌入Word控件应用"可能就是讲述如何在Java SWT界面中集成Word编辑功能,使得用户可以直接在应用程序内部创建、编辑和查看Word文档。 SWT是Eclipse开源项目的一部分,它为Java开发者提供了一套用于...

    swt程序发布,jar转exe

    标题中的“swt程序发布,jar转exe”指的是将基于Java SWT(Standard Widget Toolkit)编写的程序转换成可执行的Windows EXE文件。SWT是Java平台上的一个GUI库,它提供了与本机操作系统更紧密集成的用户界面,使得...

    SWT JFace 按键、事件、监听

    在SWT中,键盘事件的处理非常关键,尤其是对于那些依赖于键盘输入的应用程序。本文将详细介绍SWT中的按键及其对应的常量表、`KeyEvent`事件和`VerifyEvent`事件的相关知识,并通过示例进行说明。 #### 按键与对应的...

    使Excel嵌入到SWT窗口中

    使Excel嵌入到SWT窗口中 知识点一:Eclipse版本和jdk版本的选择 在本例中,我们使用的是Eclipse 3.3.1版本和jdk 5.0版本。Eclipse是一个开源的集成开发环境(IDE),它支持多种编程语言,包括Java、C++、Python等...

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

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

    swt/jface中文教程

    SWT/JFace 的形成是为了解决传统 GUI 开发中的一些问题,如:平台相关性、难以使用、性能不佳等问题。SWT/JFace 的出现,提供了一种新的 GUI 开发方式,使开发者能够快速构建高效、美观的 GUI 应用程序。 SWT/JFace...

    SWT_AWT_Swing事件处理机制

    因此,在SWT中处理事件通常需要在`handleEvent`方法内根据事件类型进行判断。 对比三者,AWT的事件处理相对简单但略显笨重,Swing提供了更丰富的功能和更优雅的代码结构,而SWT则强调与原生系统的紧密集成和高性能...

    SWT的简单实例

    1. **BUTTON**: BUTTON是SWT中用于创建按钮的类。按钮是GUI中最基本的交互元素,用户可以通过点击按钮来触发某个操作或事件。在SWT中,你可以自定义按钮的文字、图标以及响应的事件处理器。 2. **TEXT**: TEXT组件...

    swt线程冲突与解决

    针对SWT中的线程冲突问题,通常有两种常用的解决策略:同步调用和异步调用。 1. **同步调用**: - 同步调用是指在一个非UI主线程中发起请求,等待UI主线程执行完请求后返回结果。 - 在SWT中,可以使用`Display....

Global site tag (gtag.js) - Google Analytics