如何安全使用SWT的显示器asyncExec

大多数用户界面(UI)工具包都是单线程的, SWT也不例外。 这意味着必须仅从单个线程(即所谓的UI线程)访问UI对象。 另一方面,应在后台线程中执行长时间运行的任务,以使UI保持响应。 这使得后台线程需要排队在UI线程上执行更新,而不是直接访问UI对象。

为了安排代码在UI线程上执行,SWT提供了Display asyncE‌xec()和syncE‌xec()方法。

显示asyncE‌xec与syncE‌xec

虽然这两种方法都将参数放在队列中以便在UI线程上执行,但是它们在执行(或不执行)之后的操作不同。 顾名思义,asyncE‌xec()异步工作。 它在可运行变量入队后立即返回,并且不等待其执行。 而syncE‌xec()处于阻塞状态,因此确实要等到代码执行完毕。

根据经验,只要不依赖计划代码的结果即可使用asyncE‌xec(),例如仅更新小部件以报告进度。 如果计划的代码返回了与进一步控制流相关的内容(例如,在阻止对话框中提示输入),那么我将选择syncE‌xec()。

例如,如果后台线程想要报告已完成工作的进度,则最简单的形式可能如下所示:

progressBar.getDisplay().asyncE‌xec( new Runnable() {public void r‌un() {progressBar.setSelection( ticksWorked );}
} );

asyncE‌xec()计划“在下一个合理的机会”(如JavaDoc所说)在UI线程上执行可运行对象。

不幸的是,上面的代码可能会不时地失败,并会出现一个放置小部件的异常 ,或更确切地说是一个SWTException,其代码== SWT.ERROR_WIDGET_DISPOSED。

因此,原因是,进度条在被访问时可能不再存在(即,调用setSelection())。 尽管我们仍然保留着对小部件的引用,但是由于小部件本身已被废弃,因此并没有太大用处。 解决方案显而易见:代码必须首先测试该小部件是否仍然存在,然后再对其进行操作:

progressBar.getDisplay().asyncE‌xec( new Runnable() {public void r‌un() {if( !progressBar.isDisposed() ) {progressBar.setSelection( workDone );}}
} );

看起来很明显,一次又一次地执行这种检查是很乏味的。 您可能想在Eclipse bugzilla中搜索“ widget处置”,以了解此问题的发生频率。 因此,我们提取了一个封装检查的辅助类。

new UIThreadSynchronizer().asyncE‌xec( progressBar, new Runnable() {public void r‌un() {progressBar.setSelection( workDone );}} );

UIThreadSynchronizers asyncE‌xec()方法期望将小部件作为其第一个作为上下文的参数。 上下文小部件是指如果可运行的部件多于一个,则将受可运行部件或合适的父部件影响的部件。 在运行runnable之前,将检查上下文小部件。 如果仍然有效(即未处置),则将执行代码,否则,将静默删除该代码。 尽管忽略已处置小部件的代码的行为可能看起来很粗心,但它适用于到目前为止我们遇到的所有情况。

进行线程间通信的单元测试代码特别难以测试。 因此,尽管UIThreadSynchronizer是无状态的,但必须对其进行实例化以使其可以通过test double替换。

  • 带有相应测试的源代码可以在这里找到: https : //gist.github.com/rherrmann/7324823630a089217f46

尽管示例使用了asncE‌xec(),但UIThreadSynchronizer也支持syncE‌xec()。 并且,当然,helper类也与RAP / RWT兼容。

如果您完整地阅读了源代码,您可能已经注意到可能存在争用情况。 因为Widget类的所有方法都不是线程安全的,所以isDisposed()或getDisplay()返回的值可能是陈旧的(请参见第51 行和第60行 )。 当时故意将其忽略-阅读:我没有找到更好的解决方案。 尽管runnable可能会被错误地排入队列,但是isDisposed()-check(在UI线程上执行)将最终阻止代码执行。

剩下的线程问题还有另一个(绝对是很小的)机会:恰好在调用(a)syncEecxec()之前,检查显示器的处置方式,以免发生小部件处置异常。 但是,如果将显示放置在检查和(a)syncE‌xec()的调用之间,则可能会发生这种情况。 尽管可以通过将调用包装到忽略小部件处理的异常的try-catch块中来解决asyncE‌xec()的问题,但对syncE‌xec()而言,相同的方法将失败。 无法通过合理的努力将可运行对象引发的SWTException与syncE‌xec()引发的SWTException区别开来。

翻译自: https://www.javacodegeeks.com/2014/09/how-to-safely-use-swts-display-asyncexec.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决添加Com引用 生成的Interop.*.dll 版本号永远是1.0的问题

在项目里面,添加对COM的引用时,自动生成了Interop.*.dll,但是这个dll的版本号永远是1.0. 如果使用InstallShield 制作安装包,进行修改安装时,这个dll不会被更新,就因为版本号永远是1.0 想修改这个版本号&am…

web页面全角半角

根据Unicode编码,全角空格为12288,半角空格为32 ; 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 全角-->半角函数 //半角转换为全角函数 function ToBCD(str) { var tmp ""; for(var i0;…

Cannot find module '@babel/plugin-proposal-class-properties'

cnpm install --save-dev babel/plugin-proposal-class-properties转载于:https://www.cnblogs.com/qq917937712/p/11226922.html

可选和对象:空指针救星!

没有人喜欢空指针异常 ! 我们有办法摆脱它们吗? 也许 。 。 。 这篇文章中讨论了几种技术: 可选类型(Java 8中的新增功能) 对象类(旧的Java 7东西!) Java 8中的可选类型 它是什…

oracle 存储过程的基本语法 及注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :0;变量2 DATE;BEGIN END 存储过程名字2.SELECT INTO STATEMENT 将select查询的结果存入到变量中,可以同时将多个列存…

function——函数声明头的提升和预解析

函数: 即function语句的集合,就是将多个语句封装到一起; 函数的执行要会自己遍历,遇见函数 a();执行语句,就要移交控制权,函数执行完毕之后,控制权又移交回…

在JDeveloper 12.1.3中将Java API用于WebSockets

介绍 最新版本的JDeveloper 12c(12.1.3.0)和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上,从12.1.2.0版本开始就支持WebSocket协议(RFC 6455&#xff0…

基于Verilog语言的伪随机码的编写

写之初,笔者并没有太大的自信,因为笔者对伪随机码并没有太多的认识。但老师有命,笔者不得不进行编写,同时笔者也特别希望能有个项目来锻炼自己。 笔者在开始编写的时候,首先上网查了很多的资料,对伪随机码算…

【HBuilder】手机App推送至Apple App Store过程

一、前言 最近由于公司同事离职,顶替这位同事从事手机App的研发工作,BIM数据平台部门采用的是HBuilder作为手机App的制作环境。本篇介绍我是如何将HBuilder的Release包发布至App Store的。 二、内容 1. 首先登录Apple Developer网站 2. 点击iTunes Conn…

Java性能调优调查结果(第四部分)

这是系列文章中的最后一篇,我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您还没有阅读第一篇文章,我建议您首先阅读以下内容: 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工具和技术 …

2012年第一个工作日

换代理尝试,竟然可以发博客了。以前的博客太散乱,打算在这里安家。 今天花了一上午时间,在各大网站不停地晃。希望自己能够弄清楚这个快速变化的世界。 2012确切的目标: 1. 工作仍然是首要的,锻炼的能力不同而已&#…

基于ArcEngine的插件式框架

先整理下,过几天把我以前用过的一个插件式GIS框架共享出来。转载于:https://www.cnblogs.com/songhuaiyu/archive/2010/08/16/1800854.html

【JQuery】选择器

一、前言 上一章学习完了Js的一些基本内容,本章开始学习JQuery语法。JQuery的基础语法是: $(selector).action() 那么重要的两个元素,一个是选择器,另一个是行为!本章开始学习JQuery的选择器。 二、内容 $("*&quo…

android eclipse 配置 在项目右击选择properties

转载于:https://www.cnblogs.com/guoxiaoyue/p/3485243.html

减少主要GC暂停的频率

这篇文章将讨论一种技术,以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写, 在JVM中无法禁用垃圾收集 。 但是,有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知,JVM中发生了两个不同的GC…

软件工程中交流的思考

良好的交流可以有效的降低项目的开发成本,相反不但可能数倍的增加成本,甚至可能导致项目的失败。 怎样在项目执行过程进行有效的交流呢? 1. 识别项目中交流主体。 2. 明确交流主题、内容、目标。 3. 做好交流记录、分析、整理、执行。 4. 交流…

【WebGL】《WebGL编程指南》读书笔记——第2章

一、前言 最近看了《WebGL编程指南》这本书&#xff0c;发现还是很有意思的&#xff0c;故每章阅读后做个笔记。 二、正文 Example1&#xff1a;在canvas中绘制2D矩形 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /&…

一个人的网站开发

从零开始开发一个全栈Web应用实录 https://blog.csdn.net/weixin_31347831/article/details/74625813 如何用PHP完整的开发一个网站&#xff1f; https://blog.csdn.net/a6984021/article/details/88787885 一个人如何完成一整个网站的开发&#xff08;推荐好文&#xff0c;看完…

WAI-ARIA对自动完成小部件的支持

在本文中&#xff0c;我想讨论AutoComplete小部件的可访问性。 在您键入该字段时&#xff0c;通常会使用“自动完成”窗口小部件提供建议。 在当前的工作中&#xff0c;我基于Twitter的Typeahead &#xff08;一个灵活JavaScript库&#xff09;实现了JSF组件&#xff0c;该库为…

eclipse中java.lang.OutOfMemoryError: Java heap space错误

Myeclipse中报java.lang.OutOfMemoryError: Java heap space错误 解决办法: 选中被运行的类&#xff0c;点击菜单‘run->run Configuration’&#xff0c;选择(x)Argument标签页下的vm arguments框里 输入 -Xmx800m, 保存运行。问题解决 转载于:https://www.cnblogs.com/vig…