站在巨人的肩膀上:
http://www.roboticfan.com/blog/user_2005/104/archives/2006/2006530113922.shtml
刚开始使用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的执行需要等到别的线程执行完毕,回调方法才结束。
分享到:
相关推荐
因此,笔者模仿android的异步访问方式,实现SWT下的Handler机制。通过向handler发送消息,handler接受到消息以后响应消息。 你需要做的就是,在异步线程中执行你的一部操作,当异步线程结束以后需要向handler发送一...
swt线程冲突与解决,swt的使用中,UI主线程往往容易与用户线程产生冲突,这个时候就需要使用同步和异步的思想来解决这个问题
SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置
64位windows操作系统使用的SWT库
SWT库32位和64位
swt工具文档 swt工具文档 swt工具文档 swt工具文档 swt工具文档 swt工具文档
SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中
下载编译的SWT库,版本号4.911,包含多个版本: org.eclipse.swt.cocoa.macosx.x86_64 org.eclipse.swt.gtk.linux.aarch64 org.eclipse.swt.gtk.linux.arm org.eclipse.swt.gtk.linux.ppc64le org.eclipse.swt.gtk....
SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法
swt 基础教程 swt 基础教程 swt 基础教程swt 基础教程swt 基础教程
JFace-SWT-中文版API(含swt.jar和swt-debug.jar)
swt教程 有关SWT怎么应用
org.eclipse.swt.SWT.class org.eclipse.swt.SWTError.class org.eclipse.swt.SWTException.class org.eclipse.swt.accessibility.ACC.class org.eclipse.swt.accessibility.Accessible.class org.eclipse.swt....
本地文件同步,没有网络传输功能,以后再加吧
java swt 实现的隐藏和显示任务栏图标和托盘图标的(导入swt包即可)
SWT并发例子(后台耗时线程)前台点击按钮,后台执行一个耗时操作。
SWT官方api文档 开发基于swt的GUI程序必备手册
JFace-SWT-中文版API(含swt.jar和swt-debug.jar)
swt.jar swt.jar swt.jar swt.jar swt.jar
swt table 实现换行