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

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)syncE‌xec()之前,检查显示器是否可处置,以免发生小部件处置异常。 但是,如果将显示放置在检查与(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

asyncexec

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

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

相关文章

属性面板 脚本_3.1 创建和使用脚本

在unity中,游戏物体的行为是通过组件来驱动的,我们可以通过内建的组件来给我们的游戏物体组合各种能力,尽管如此,要知道我们的需求永远是动态的,很快我们就会发现,内建的组件功能已经无法满足我们的需求&am…

新的JMetro JavaFX 11兼容版本

你好,我们又见面了! 这次是一个新版本,该版本与JavaFX 11兼容。 继续阅读以获取详细信息。 JMetro 8.5.7和11.5.7版本 JMetro代码已分为2个分支。 master分支具有Java 8兼容的JMetro版本,“ 11”分支具有Java 11兼容的版本。 以…

vue加跨域代理静态文件404_解决vue本地环境跨域请求正常,版本打包后跨域代理不起作用,请求不到数据的方法——针对vue2.0...

问题:在本地使用了proxyTable代理可以正常跨域请求后台数据,打包上传后就无法获得后台的json文件。查看了相关资料可以用nginx进行解决。还可以使用命名环境变量,请求的时候进行判断,话不多说上干货module.exports merge(prodEnv…

tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部

tomee我有一个需要在完成某些工作时通知用户的应用程序。 它使用JSF和Primefaces,因此可以使用大气 (也称为Push)来实现这种通知。 但是另一个有趣的方法是使用嵌入在Java Web应用程序中的XMPP服务器。 好的,好的,您不…

板框导入_板框结构导入有问题?这几个问题最常见,附解决方法!

对于一些比较复杂的结构,Altium的处理能力有限,通常采用AutoCAD来进行设计,然后在Altium中执行菜单栏中“文件”→“导入”→DWG/DXF命令,选择需要导入的DXF文件即可。如果导入过程中出现了乱码,报错等问题要如何解决呢…

您如何使用硒来计算自动化测试的投资回报率?

跨浏览器测试是一种测试,需要大量的精力和时间。 通过不同的浏览器,操作系统,设备,屏幕分辨率测试Web应用程序,以评估针对各种受众的Web内容呈现的过程是一项活动。 特别是如果手动处理。 使用Selenium进行的自动跨浏览…

流量复制_详解Linux系统流量复制--gor、tcpcopy、nginx模块流量复制等

概述对于一些有并发要求的业务,特别是对接外部流量时,产品上线前一定要做的就是压力测试,但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbench、http_load为例,这些通过模拟请求的压测工具,只能发送特定的…

mongodb+java_Java EE + MongoDb与Apache TomEE和Jongo Starter项目

mongodbjava知道MongoDB和Java EE ,但是您不确切地知道如何将它们集成在一起? 您是否阅读了很多有关该主题的内容,但没有找到适合该目的的解决方案? 这个入门项目适合您: 您将学习如何以一种时尚的方式使用MongoDB和J…

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历作者用代码更新了自己的简历,是不是很接地气,特符合程序员的逼格。这是一份可读可执行的语言源文件,也是作者编码风格的体现。C语言源码&#x…

hash值 更改git_Git切换版本

Git切换版本有三种方式:1.基于哈希值切换》基于哈希值切换(推荐),命令:git reset --hard 哈希值,哈希值从哪来,git reflog查看下就知道了,切换版本后,git reflog会发现有两个HEAD,别…

devc++ 文件未编译问题

点击 文件 然后点击关闭全部文件, 重新打开一下软件件就好了

候选JEP:记录和密封类型

马克赖因霍尔德(Mark Reinhold )本周在OpenJDK琥珀色开发者邮件列表上宣布了两个新的紧密相关的候选 JDK增强提案( JEP) ,其帖子分别为“ 新候选JEP:359:记录(预览) ”和…

fedora mysql_Fedora server 安装Mysql8

导读MySQL是一种关系数据库管理系统(RDBMS),作为服务器运行,提供对多个数据库的多用户访问。 这是指导,如何在Fedora 28/27/26,CentOS 7.5 / 6.10和Red Hat(RHEL)7.5 / 6.10上安装或升级MySQL社区服务器最新版本8.0(8.0.12)/5.7(5…

lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

lombok 生成代码对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此,该类只需要存储一些值就可以。 您需要这些值的getter和setter方法,也许您还需要一个构造函数,覆盖equals()和 hash…

让C/C++程序员告诉你什么叫浪漫,表白黑科技,炫酷多彩求爱利器

前言缘是美丽的邂逅,爱是心跳的感觉,情是心灵的交会,恋是甜蜜的思念,走在爱与被爱的边缘,你见或者不见,爱你的心始终不改变!C语言诠释爱——为TA写下心中情,生成程序传给TA&#xff…

mysql 支持json_MySQL 5.7 对 JSON 的支持

最近有个业务需要能够存储Json并做一些简单的业务逻辑处理。业务找到我说json的数据分析很难用mysql 5.6,这样的纯粹行存来处理难度很大,问我有没啥办法。我第一想到的是mongodb,第二想到的就是mysql 5.7 。 然后一查,哎呀,已经GA…

Java十六进制浮点文字

我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性。 如果重新格式化,当前版本的代码将覆盖原本相同的代码。 这很烦人,因为按下重新格式化键的快捷键相当容易,而且许多项目甚至要求开发…

mysql内部损坏_mysql表损坏故障案例

开发人员反映猎豹有个功能报500错误,让我查一下服务器上有没有做过什么调整,额,不会吧,今天元旦啊,谁会闲的蛋疼去调试服务器啊,最后他们查到了和一个表有关的sql都执行不了,那肯定是这个表损坏…

C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

C语言对自己电脑做的事儿啊,总有那么一丝恐怖,C语言与电脑两例开场先抱歉,偷懒好多天了。今天分享给大家的l两例比较短小精悍,都是针对于计算机屏幕处理的两例,有兴趣的可以放到自己电脑上运行哦。绝对无害&#xff0c…

servlets_jQuery Ajax – Servlets集成:构建完整的应用程序

servlets网上有很多教程,它们解释了有关使用servlet和JSP页面进行Java Web开发的一些知识,但是,我从未找到对于初学者来说足够简洁的教程。 这样的教程应该解释创建一个简单的Web应用程序的整个过程,包括前端,后端&…