`
crazycow
  • 浏览: 27796 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Display的syncExec和asyncExec

 
阅读更多

背景

一直在用Display.syncExec(Runnable)和Display.asyncExec(Runnable),只简单知道同步用前者,异步用后者,而且代码也工作的很好,今天把它后面的源代码都了一遍,有了更清楚的认识。

1,每个Display会关联一个Thread(在Shell或Eclipse环境中一般即为UI主线程),Display.readAndDispatch()方法可以用来处理OS发送过来的消息,也可以处理自身的消息队列,代码片段如下

public boolean readAndDispatch () {
	checkDevice ();
	lpStartupInfo = null;
	drawMenuBars ();
	runPopups ();
	if (OS.PeekMessage (msg, 0, 0, 0, OS.PM_REMOVE)) {
		if (!filterMessage (msg)) {
			OS.TranslateMessage (msg);
			OS.DispatchMessage (msg);
		}
		runDeferredEvents ();
		return true;
	}
	return runMessages && runAsyncMessages (false);
}

 2,每个Widget会关联到一个Display。特别对于Shell,可以构建UI,并进入消息循环。

    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setMinimized(true);
    shell.open();
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }

 3,一般用Display.syncExec(Runnable)和Display.asyncExec(Runnable)在UI主线程中同步或异步执行一段代码。同步和异步相关的两个线程,一个是该方法的调用线程,一个是和Display线程。当然调用线程本身也可以是和Display线程。

4,当调用线程和Display线程是同一线程时
(1)asyncExec(Runnable)将Runnable加入Display的消息队列,方法退出
(2)syncExec (Runnable)直接执行Runnable,方法退出

5,当调用线程和Display线程不是同一线程时
(1)asyncExec(Runnable)将Runnable加入Display的消息队列,方法退出。这和同一线程的情况一致。
(2)syncExec (Runnable)将Runnable加入Display的消息队列,然后等待Display将该Runnable执行完毕后,方法再退出。

protected void asyncExec (Runnable runnable) {
	if (runnable == null) {
		//TEMPORARY CODE
		if (!IS_CARBON) {
			display.wake ();
			return;
		}
	}
	addLast (new RunnableLock (runnable));
}


protected void syncExec (Runnable runnable) {
	RunnableLock lock = null;
	synchronized (Device.class) {
		if (display == null || display.isDisposed ()) SWT.error (SWT.ERROR_DEVICE_DISPOSED);
		if (!display.isValidThread ()) {
			if (runnable == null) {
				display.wake ();
				return;
			}
			lock = new RunnableLock (runnable);
			/*
			 * Only remember the syncThread for syncExec.
			 */
			lock.thread = Thread.currentThread();
			addLast (lock);
		}
	}
	if (lock == null) {
		if (runnable != null) runnable.run ();
		return;
	}
	synchronized (lock) {
		boolean interrupted = false;
		while (!lock.done ()) {
			try {
				lock.wait ();
			} catch (InterruptedException e) {
				interrupted = true;
			}
		}
		if (interrupted) {
			Compatibility.interrupt();
		}
		if (lock.throwable != null) {
			SWT.error (SWT.ERROR_FAILED_EXEC, lock.throwable);
		}
	}
}
 

 6,当在一个UI主线程中打开一个Dialog时,就会嵌套进入到另一个Shell的消息循环,但他们都用主线程的Display,都在主线程中。

分享到:
评论
1 楼 a222aaaa 2014-08-16  
好高深难懂。。

相关推荐

    swt线程冲突与解决

    - 在SWT中,可以使用`Display.syncExec(Runnable)`方法来实现同步调用。 - 这种方式适用于需要等待UI操作完成并获取结果的场景。 ```java Display.getDefault().syncExec(new Runnable() { @Override public ...

    SWT应用的开发实例:没有使用到OSGi

    为了实现程序的逻辑,还需要使用`Thread`或者`Display.asyncExec`、`Display.syncExec`来处理异步任务,确保GUI更新的正确性和响应性。 在没有使用OSGi的情况下,开发者需要自行管理类的加载和依赖关系。这可能意味...

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

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

    SWT API 资料

    为了实现异步处理,可以使用`Display.asyncExec`和`Display.syncExec`方法,它们能够在正确的线程上下文中执行回调。 ### 9. 高级特性 SWT还提供了许多高级特性,如拖放支持、打印功能、数据库访问、国际化和本地...

    基于swt的小软件

    例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...

    swt源码以及jar

    开发者可以通过`Display.syncExec()`或`Display.asyncExec()`方法在UI线程中执行任务。 除了基本的GUI组件,SWT还提供了许多高级功能,比如对话框(Dialogs)、表格(Table)、树形视图(Tree)、进度条...

    SWT综合教程及安装指导

    2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在EDT中执行代码。 3. 异步任务:为了执行耗时操作,通常会创建后台线程,完成后通过回调更新GUI。 三、布局管理 1. 布局(Layout):SWT...

    swt 多线程

    总结来说,SWT的多线程机制是通过Display类提供的`asyncExec`、`syncExec`和`timerExec`方法来实现的,它们允许开发者在不阻塞UI线程的情况下执行后台任务。理解和熟练运用这些方法是构建高效、响应性强的SWT应用的...

    java SWT编写的截图程序

    7. **异步执行:** 图像处理可能会消耗一定时间,因此通常在后台线程(通过`Display.asyncExec()`或`Display.syncExec()`)执行,以避免阻塞UI。 **SWT截图程序的优势:** 1. **原生体验:** SWT直接调用操作系统...

    Graphics Moving Package

    7. **动画框架**:虽然SWT没有内置的动画框架,但开发者可以自定义实现,例如通过使用`Display.syncExec`或`Display.asyncExec`来在 SWT 线程中更新图形状态,实现平滑的动画效果。 8. **布局管理**:SWT 提供了...

    swt

    通常,使用Display.asyncExec()和Display.syncExec()方法来确保在正确的线程(即UI线程)中更新界面元素,防止出现线程安全问题。 **学习资源:** 博文链接提到的是一个关于SWT的博客文章,可能包含一些实用的示例...

Global site tag (gtag.js) - Google Analytics