首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

Display的syncExec跟asyncExec

2012-09-14 
Display的syncExec和asyncExec背景一直在用Display.syncExec(Runnable)和Display.asyncExec(Runnable),只

Display的syncExec和asyncExec

背景

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

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

protected void asyncExec (Runnable runnable) {if (runnable == null) {//TEMPORARY CODEif (!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,都在主线程中。

热点排行