刚开始使用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同样不允许主线程外的其他线程直接访问控件。 所以SWT为我们提供了async执行Runnable的方法。...将在下一个版本中加入MessageQueue机制,实现多任务后台处理相应。 具体使用请参考test包下的Handler使用事例。
SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法SWT插件中文教程SWT常用方法
SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置
SWT中文教程.rar/////SWT中文教程.rar
Eclipse中SWT插件的安装Eclipse中SWT插件的安装
swt线程冲突与解决,swt的使用中,UI主线程往往容易与用户线程产生冲突,这个时候就需要使用同步和异步的思想来解决这个问题
64位windows操作系统使用的SWT库
rcp开发中用到的swt/Jface组件等 Swt.JFace.in.Action中文版
swt工具文档 swt工具文档 swt工具文档 swt工具文档 swt工具文档 swt工具文档
非常不错的java swt 中文文档
SWT并发例子(后台耗时线程)前台点击按钮,后台执行一个耗时操作。
SWT examples,SWT官方例子:http://www.eclipse.org/swt/examples.php 该页面所要下载的例子 其中,swt的例子在\plugins\org.eclipse.swt.examples.source_3.7.0.v3740f.jar中
使Excel嵌入到SWT窗口中 使用的Eclipse版本:3.3.1 使用的jdk版本:5.0
swt/jface中文教程,很实用,适合渴望学习swt的人需求
swt教程 有关SWT怎么应用
swt 基础教程 swt 基础教程 swt 基础教程swt 基础教程swt 基础教程
Eclipse SWT/JFace SWT JFace 实例 Eclipse SWT/JFace 书中 全部实例
下载编译的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 table 实现换行
本地文件同步,没有网络传输功能,以后再加吧