在SWT中,通常需要开多个线程来执行任务,因为主线程为UI线程,不能用太长的时间来执行某个任务,否则会造成失去响应的假象。
SWT的线程通信有几个要注意的地方:
1、工作线程访问UI线程。不能在非UI线程中直接访问UI控件的值,要获得或设置控件的值必须通过Display对象的asyncExec()或syncExec()函数,一般的使用方法是:
//代码A:
Display disp = Display.getDefault();
if(disp != null) {
disp.asyncExec(new Runnable() {
public void run() {
// 在这里设置或获得控件的值
}
});
}
2、内部类与外部类的交流。内部类调用外部类局部变量时,该变量必须是final的,这样在取得控件的值后返回给外部类处理时就比较麻烦。例如,在上面的代码段中,有个匿名内部类实现了Runnable接口,在里面的run()函数里可以访问到UI对象,但是,得到了对象的值怎么告诉外面的代码呢?假如用普通的局部变量传递进去,由于是final的,是不能赋值的,所以需要有一个封装类来把需要返回的变量封装起来,这个封装类是final的,但里面的成员变量是可变的,这样就把内部类里得到的东西传递到了外部,不过似乎比较麻烦,不知道有没有更好的办法。
//代码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()机制来实现同步。
//代码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。
//代码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的值进行访问
分享到:
相关推荐
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代码+论文) JAVA图书管理系统毕业设计(源代
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
系统可以提供信息显示和相应服务,其管理新冠抗原自测平台小程序信息,查看新冠抗原自测平台小程序信息,管理新冠抗原自测平台小程序。 项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 部署容器:tomcat7 小程序开发工具:hbuildx/微信开发者工具
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
新建 文本文档.docx
hw06
3. Kafka入门-安装与基本命令
燃气管道施工资质和特种设备安装改造维修委托函.docx
AI大模型研究相关报告
lab02
仅供学习使用,其他用途请购买正版资源AVPro Video Core Windows Edition 2.2.3 亲测可用的视频播放插件,能丝滑播放透明视频等.
建设工程消防验收现场指导意见表.docx
MVIMG_20241222_194113.jpg
五相电机双闭环矢量控制模型_采用邻近四矢量SVPWM_MATLAB_Simulink仿真模型包括: (1)原理说明文档(重要):包括扇区判断、矢量作用时间计算、矢量作用顺序及切时间计算、PWM波的生成; (2)输出部分仿真波形及仿真说明文档; (3)完整版仿真模型:包括邻近四矢量SVPWM模型和完整双闭环矢量控制Simulink模型; 资料介绍过程十分详细,零基础手把手教学,资料已经写的很清楚
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7