在SWT中,通常需要开多个线程来执行任务,因为主线程为UI线程,不能用太长的时间来执行某个任务,否则会造成失去响应的假象。
SWT的线程通信有几个要注意的地方:
1、工作线程访问UI线程。不能在非UI线程中直接访问UI控件的值,要获得或设置控件的值必须通过Display对象的asyncExec()或syncExec()函数,一般的使用方法是:
Java代码
//代码A:
Display disp = Display.getDefault();
if(disp != null) {
disp.asyncExec(new Runnable() {
public void run() {
// 在这里设置或获得控件的值
}
});
}
//代码A:
Display disp = Display.getDefault();
if(disp != null) {
disp.asyncExec(new Runnable() {
public void run() {
// 在这里设置或获得控件的值
}
});
}
2、内部类与外部类的交流。内部类调用外部类局部变量时,该变量必须是final的,这样在取得控件的值后返回给外部类处理时就比较麻烦。例如,在上面的代码段中,有个匿名内部类实现了Runnable接口,在里面的run()函数里可以访问到UI对象,但是,得到了对象的值怎么告诉外面的代码呢?假如用普通的局部变量传递进去,由于是final的,是不能赋值的,所以需要有一个封装类来把需要返回的变量封装起来,这个封装类是final的,但里面的成员变量是可变的,这样就把内部类里得到的东西传递到了外部,不过似乎比较麻烦,不知道有没有更好的办法。
Java代码
//代码B:
class StringWrapper {
public String uiValue;
}
StringWrapper sw = new StringWrapper();
Display disp = Display.getDefault();
if (disp != null ) {
disp.asyncExec(new Runnable() {
public void run() {
sw.uiValue = text.getText();//假设text是一个文本框对象
// 在这里设置或获得控件的值
}
});
}
//这里就可以对sw.uiValue的值进行访问
//代码B:
class StringWrapper {
public String uiValue;
}
StringWrapper sw = new StringWrapper();
Display disp = Display.getDefault();
if (disp != null ) {
disp.asyncExec(new Runnable() {
public void run() {
sw.uiValue = text.getText();//假设text是一个文本框对象
// 在这里设置或获得控件的值
}
});
}
//这里就可以对sw.uiValue的值进行访问
3、线程间的同步。在上面的代码B中,通过asyncExec()函数来取得控件的值所需要的时间比较长,如果在后面马上访问那些值是得不到的,于是就需要有个同步的问题,即在控件值取得之前先不进行下一步操作。可以通过synchronized块及wait(),notify()机制来实现同步。
Java代码
//代码C:
class StringWrapper {
public String uiValue;
}
StringWrapper sw = new StringWrapper();
Display disp = Display.getDefault();
if (disp != null ) {
disp.asyncExec(new Runnable() {
public void run() {
synchronized(sw){
sw.uiValue = text.getText();//假设text是一个文本框对象
sw.notify();
}
// 在这里设置或获得控件的值
}
});
}
synchronized(sw){
sw.wait();
}
//这里就可以对sw.uiValue的值进行访问
//代码C:
class StringWrapper {
public String uiValue;
}
StringWrapper sw = new StringWrapper();
Display disp = Display.getDefault();
if (disp != null ) {
disp.asyncExec(new Runnable() {
public void run() {
synchronized(sw){
sw.uiValue = text.getText();//假设text是一个文本框对象
sw.notify();
}
// 在这里设置或获得控件的值
}
});
}
synchronized(sw){
sw.wait();
}
//这里就可以对sw.uiValue的值进行访问
但是这里会带来一个问题,假如很快就能取得控件的值,但后面还有很长一段时间才会用到该值,如果把sw.wait()语句放在比较后的地方,就有可能造成死锁,因为sw已经被notify之后才开始wait的,再没有其他线程来notify它了,它就只能一直wait下去……。为了解决这个问题,可以(1)把sw.wait()紧跟在disp.asyncExec()后面;(2)给wait()设置一个timeout参数,到了一定的时间还没有东西notify它,它就自己超时。但这两种办法似乎都比较牵强,没有十足的保证,JDK文档里面有个例子,是用while来判断是否已经达到了要求,如果已经达到了就不再wait。
Java代码
//代码D:
class StringWrapper {
public String uiValue;
public boolean isValueSet;//是否已经取得了控件的值
}
StringWrapper sw = new StringWrapper();
sw.isValueSet = false;
Display disp = Display.getDefault();
if (disp != null ) {
disp.asyncExec(new Runnable() {
public void run() {
synchronized(sw){
sw.uiValue = text.getText();//假设text是一个文本框对象
sw.isValueSet = true;
sw.notify();
}
// 在这里设置或获得控件的值
}
});
}
synchronized(sw){
while(!sw.isValueSet){
try{
sw.wait();
}catch (InterruptedException e){
}
}
}
//这里就可以对sw.uiValue的值进行访问
分享到:
相关推荐
swt线程冲突与解决,swt的使用中,UI主线程往往容易与用户线程产生冲突,这个时候就需要使用同步和异步的思想来解决这个问题
详细讲解SWT线程的开发技术。 传统的AWT开发技术的诸多弊端,促使了各种AWT替代技术的出现,而SWT便是这些技术中的优秀代表,文档详细讲解了基于SWT开发桌面程序中可能遇到的种种问题,其中SWT线程便是亮点之一,读...
局域网聊天 SWT Java QQ 多线程的处理已经解决 非常好的学习资料
swt与socket的网络通信。一个服务端,一个客户端。并且UI组件和SOCKET是分开的。里面用到了关于SWT的线程处理。很不错! 运行: 先开启服务器。然后点客户端的连接即可。 需要说明的是里面有些图片。我没有上传。你...
开发平台:myeclipse,tomcat,mysql 使用SWT&JFACE开发的一个通信录
SWT并发例子(后台耗时线程)前台点击按钮,后台执行一个耗时操作。
該文檔是 工作中遇到ui层先后展示问题,查询的swt rcp ui 多线程原理,分享给大家,希望能共同学习
SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置 SWT配置
64位windows操作系统使用的SWT库
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 基础教程
swt页面后台多线程接受ModBUS协议Socket通讯的数据
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....
SWT官方api文档 开发基于swt的GUI程序必备手册
swt.jar swt.jar swt.jar swt.jar swt.jar
swt table 实现换行