`
fm2005
  • 浏览: 18180 次
社区版块
存档分类
最新评论

SWT中定时器的一种特殊实现方式/SWT中线程互访时display.asyncExec/display.syncExec...程序死掉无响应的解决办法

 
阅读更多

最近在研究SWT,写了个小例子,涉及到线中的数据互访,如果在一个线程中的触发事性中再去访问另一个线程的数据,会把Invalid thread access的错误。

用SWT提供的display.asyncExec方法,发现其实质根本不是另开一个线程,只是把run方法调用了一次,所以导致调用Thread.sleep时程序就会死掉。

经过查阅资料及baidu和google,找到了解决办法,现总结一下:

1、定时器实现方式,在Main方法中加一个定时器,代码如下:()

2、但有时候并不一定要程序执行时就要定时检测,有时需要外部事情激发这就出现了第2种解决方案,写一个内置类,可以放在事件监听的方法中,然后激发:

3、第二种方法虽好,可是创建了不少对象,对程序优化一下,可以得到更好的一种解决方案(比第二种方法少创建一个对象):

顺便再说一下display.asyncExec和display.syncExec的区别:

SWT组件Diaplay提供syncExec与asyncExec方法,其原型为:syncExec (Runnable runnable),asyncExec (Runnable runnable),Runnable的run方法中可以封装要执行的代码,一般而言是UI相关的代码,如更新组件显示、刷新状态等。Diaplay是和线程关联的,其所在的线程一般称谓UI线程,可以有多个UI线程,每个UI线程一个Diaplay。所有的SWT组件相关代码,必须在UI线程之中执行。

syncExec与asyncExec相同点,都是为了让Runnable封装的代码在指定的Diaplay(比如某个产成Image的diaplay) 相关的UI线程中执行。如:imgCreateDiaplay.asyncExec(runnable)。需要说明的是,当前线程一般是非UI线程,也可以是UI线程(如其它UI相关线程如awt UI线程,和为提高执行效率,多个SWT UI线程之间协作并发执行,甚至调用线程和执行runnable的UI线程是同一个线程)

syncExec与asyncExec不相同点体现在对方法调用线程本身的影响,syncExec阻塞当前线程直到UI线程完成runnable中的代码执行;而asyncExec则直接返回,不等待runnable中代码被执行,但并不是说asyncExec执行的代码一定不在同一个线程中,有些时候是同一个线程,只不过将代码的执行根据需要分成两个部分或多个部分处理。

两者的异同决定了其分别适应不同的场合,一般syncExec适合在需要同步UI更新之后继续执行的代码,asyncExec适合在不便、不能syuncExec的情况下使用。

syncExec适用情况比较简单,以下总结asyncExec的适用情况。

1、非UI线程需要调用在UI线程中调用的组件方法。非UI线程是相对与UI线程来讲的,UI线程准确的讲是diaplay变量所在的线程,因此非UI线程其实是非display所在的线程,其可以是任何其它线程,如UI无关的后台作业处理线程、SWT-AWT共用应用中的awt所在线程、其它 display线程(这种情况比较少,一般应用于服务程序,如大量生成图片的多UI线程,相互之间协调时的调用,如几个UI线程负责地图图片的绘制,然后交给另外一个UI线程做装饰处理);

2、跳出当前UI事件处理,安排后续事件。当前display所在的UI线程,在事件处理过程中,需要在执行完毕之后启动另外一个UI处理过程,可以使用 asyncExec,发起另外一个UI线程处理,结束当前的UI处理。有几种情况下需要这么做:A、当前事件处理必须执行完毕,使应用到达一定的状态之后,做另外的UI处理,但是由于SWT、JFace或其它应用框架的存在,当前事件处理完成之后需要应用框架执行一些其它代码之后才可以执行另外的UI处理,否则会导致状态不一致,界面出错。但是当前事件处理完毕之后,不会出现其它事件来触发需要另外执行的代码,此时可以使用asyncExec,在框架的事件处理序列中插入另外一个事件,在当前事件处理完毕之后的某个时刻(一般很快)来执行;B、定时刷新或其它不是很重要的UI操作,通过 asyncExec执行,不影响重要的UI事件处理。asyncExec所在的事件队列优先级较低。

3、事件比较密集,而且不均衡,有时非常密集,有时不太密集,为了将事件处理均衡处理,使UI线程始终能够应付自如,而不是延迟重要事件的处理、使用户感到界面迟钝现象,将不重要的事件放到低优先级序列中,从而保证用户响应性,界面整体的有效性。

asyncExec使用时需要注意的问题主要在于两个方面。
1、响应及时性。可以认为SWT存在两个事件队列,正常UI事件队列,需异步处理的队列,该队列优先级较低,asyncExec对应于SWT低优先级队列,因此有可能在正常队列事件较多、事件处理较慢的时候,asyncExec相关代码不能及时执行的问题,从而导致响应不够及时;
2、多线程同步问题。假如某段事件处理代码发出多个asyncExec请求,每个asyncExec代码访问同一个变量,假设该变量是整数,第一次发出请求是值为1、第二次为2、第三次为3,所有请求发出,该事件处理完毕时,整数值为5,随后第一次发出的asyncExec请求执行,访问整数变量,此时为 5,而本应该是1,其它几个有类似问题。


当然了,Display也提供了timerExec,可以将其理解为Timer和asyncExec两者的结合,代码在指定时间之后异步执行。

分享到:
评论

相关推荐

    毕设项目:C++ Qt 基于数据库Mysql学生信息管理系统.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    洛雪音乐助手自定义音源v1.2.0下载.zip

    洛雪音乐助手自定义音源v1.2.0下载.zip

    125.0.6422.142 -chromedriver-win64

    版本为125.0.6422.142的chromedriver,供对应版本的谷歌浏览器进行爬虫的驱动

    160-微信小程序-信息科技公司展示小程序.zip

    源代码+截图

    aiohttp-3.7.0-cp37-cp37m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    带外设的51单片机,集成了0.96英寸的屏幕和外接的引脚.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    cryptography-2.4.1-cp35-cp35m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    上市公司企业短期并购绩效和长期并购绩效数据集合(2008-2022).txt

    因文件较多,数据存放网盘,txt文件内包含下载链接及提取码,永久有效。 样例数据及详细介绍参见文章:https://blog.csdn.net/li514006030/article/details/139608790

    《低成本开放式架构跌倒检测系统作为无线传感器网络实现》matlab代码.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    牛顿环仿真matlab.rar

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路.zip

    基于555定时器的占空比可调电路单稳态延时电路积分电路multisim仿真电路: 单稳态延时电路.ms10 单稳态延时电路.ms10 (Security copy) 占空比可调电路设计.ms10 占空比可调电路设计.ms10 (Security copy) 积分电路.ms10 积分电路.ms10 (Security copy)

    087-微信小程序-课程预约.zip

    源代码+截图

    EnviroSkyandWeather v2.1.1(u2017.1.2)真实动态天气系统包

    unity真实动态天气系统包

    openHarmony的编码规范

    openHarmony的编码规范

    小程序-32-基于微信小程序的新生报到系统--LW-源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    cryptography-1.4-cp33-cp33m-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    计算机专业毕设课设-JAVA班主任管理系统(源代码+论文).zip

    私人云盘(自动云同步)

    1、实现功能:模仿小米的云服务,实现一个通过TCP实现的私人云盘,因为能力有限,所以只实现自动云同步这一个功能,具体可以分为三个小功能,即保持云端和终端数据一致、实现文件的上传与下载以及手动同步。 2、涉及知识点:涉及到的知识点主要有文件的打开与关闭,文件的发送与接收,文件的写入及socket通信,为了项目整体的间接性,还使用到的枚举类型的结构体以及链表对部分功能进行了封装。 3、通过项目进一步强化自己学习到的知识,并将其融会贯通,提升自己的编程能力

    atcoder ABC 354-ABC题详解

    难度划分: A题:ABC比赛中最简单的一道题目,通常是基础的输入输出题或简单的数学运算。解决A题所需思维和编程能力相对较低,通常可在10分钟内完成。 B题:中等难度的题目,可能涉及一些较为复杂的算法,需要一定的逻辑思维和编程技巧。解决B题可能需要20分钟到半个小时的时间。 C题及以上:难度逐渐增加,可能需要更深入的专业知识和算法能力。

    基于springboot的驾校管理系统

    开发语言:Java JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.6/5.7(或8.0) 数据库工具:Navicat 开发软件:idea 依赖管理包:Maven 代码+数据库保证完整可用,可提供远程调试并指导运行服务(额外付费)~ 如果对系统的中的某些部分感到不合适可提供修改服务,比如题目、界面、功能等等... 声明: 1.项目已经调试过,完美运行 2.需要远程帮忙部署项目,需要额外付费 3.本项目有演示视频,如果需要观看,请联系我v:19306446185 4.调试过程中可帮忙安装IDEA,eclipse,MySQL,JDK,Tomcat等软件 重点: 需要其他Java源码联系我,更多源码任你选,你想要的源码我都有!

Global site tag (gtag.js) - Google Analytics