- 浏览: 149536 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
EclipseEye:
fair_jm 写道不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程 -
fair_jm:
不错 蛮详细的 谢谢分享
SWT/JFace专题 --- SWT中Display和多线程
以下为UIJob的源码,关键在run方法中的
asyncDisplay.asyncExec(new Runnable() {...}
________________________________________________________________
1.Job
使用Job可以确定处理操作何时完成、避免共享资源之间的冲突、与系统上其他的平台命令平衡处理请求,
以及可能以一种不被干扰的形式把结构显示给用户。
2.UIJob
UIJob是运行在Workbench的用户界面线程上的专用Job类。处理操作在runInUIThread方法中定义。当进行调度时,
作业管理器把UIJob放到队列中,直到在Workbench的用户界面线程上执行它。每次只有一个UIJob的对象可以运行,
因为当UIJob运行时,它阻塞了用户界面线程。
当需要在用户界面线程运行一套重要的处理操作,并且希望通过作业管理器把这些请求和其他访问的作业进行平衡时,
可以考虑使用UIJob。通过使用作业管理器来访问用户界面线程,也可使用作业调度规则和Job API来控制盒管理处理过程。
asyncDisplay.asyncExec(new Runnable() {...}
public abstract classUIJob extends Job { private Display cachedDisplay; public UIJob(String name) { super(name); } public UIJob(Display jobDisplay, String name) { this(name); setDisplay(jobDisplay); } public static IStatus errorStatus(Throwable exception) { return WorkbenchPlugin.getStatus(exception); } public final IStatus run(final IProgressMonitor monitor) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } Display asyncDisplay = getDisplay(); if (asyncDisplay == null || asyncDisplay.isDisposed()) { return Status.CANCEL_STATUS; } asyncDisplay.asyncExec(new Runnable() { public void run() { IStatus result = null; Throwable throwable = null; try { //As we are in the UI Thread we can //always know what to tell the job. setThread(Thread.currentThread()); if (monitor.isCanceled()) { result = Status.CANCEL_STATUS; } else { UIStats.start(UIStats.UI_JOB, getName()); result = runInUIThread(monitor); } } catch(Throwable t){ throwable = t; } finally { UIStats.end(UIStats.UI_JOB, UIJob.this, getName()); if (result == null) { result = new Status(IStatus.ERROR, PlatformUI.PLUGIN_ID, IStatus.ERROR, ProgressMessages.InternalError, throwable); } done(result); } } }); return Job.ASYNC_FINISH; } public abstract IStatus runInUIThread(IProgressMonitor monitor); public void setDisplay(Display runDisplay) { Assert.isNotNull(runDisplay); cachedDisplay = runDisplay; } public Display getDisplay() { //If it was not set get it from the workbench if (cachedDisplay == null && PlatformUI.isWorkbenchRunning()) { return PlatformUI.getWorkbench().getDisplay(); } return cachedDisplay; } }
________________________________________________________________
1.Job
使用Job可以确定处理操作何时完成、避免共享资源之间的冲突、与系统上其他的平台命令平衡处理请求,
以及可能以一种不被干扰的形式把结构显示给用户。
2.UIJob
UIJob是运行在Workbench的用户界面线程上的专用Job类。处理操作在runInUIThread方法中定义。当进行调度时,
作业管理器把UIJob放到队列中,直到在Workbench的用户界面线程上执行它。每次只有一个UIJob的对象可以运行,
因为当UIJob运行时,它阻塞了用户界面线程。
当需要在用户界面线程运行一套重要的处理操作,并且希望通过作业管理器把这些请求和其他访问的作业进行平衡时,
可以考虑使用UIJob。通过使用作业管理器来访问用户界面线程,也可使用作业调度规则和Job API来控制盒管理处理过程。
发表评论
-
再说SWT中的滚动面板ScrolledComposite实现
2013-06-19 15:43 2329记得以前写过一篇关于滚动面板的文章 SWT中 Scrolle ... -
OSGi参考资料
2013-04-18 01:11 684基于 OSGi 的面向服务的组件编程 探索 OSGi 框架的组 ... -
CDT(编辑、调试)参考资料
2013-04-17 02:15 1115CDT编辑器 --------- 构建基于 CDT 的编辑器, ... -
Workspace Resource框架专题(3)处理工作空间资源更改事件
2013-04-17 01:44 13803 处理工作空间资源更改事件 工作空间API允许工具对它 ... -
Workspace Resource框架专题(2)workspace 框架API
2013-04-17 01:27 14922 工作空间API 本 ... -
Workspace Resource框架专题(1)Resource的概念
2013-04-17 01:12 13951 Resource的概念 如 ... -
如何恢复断点及Marker
2013-03-05 00:41 0如何恢复断点及Marker -
深入Workbench框架
2013-03-01 02:10 1732深入Workbench框架(结合UIPersistent) 1 ... -
Eclipse插件开发中的Action
2013-02-24 23:10 2006插入点用来定义菜单出 ... -
Eclipse开发中编辑器(Editors)和视图(View)总结
2013-02-24 22:58 29141.视图(Views) 视图( ... -
SWT/JFace专题 --- 对话框向导(Dialogs Wizards)
2013-02-24 22:42 2244对话框向导(Dialogs Wizar ... -
SWT/JFace专题 --- JFace
2013-02-24 22:37 1645JFace JFace是基于SWT的一套图形工具包,它没有为 ... -
SWT/JFace专题 --- SWT中Display和多线程
2013-02-24 15:25 3242Display 1.Display 的创建 一个SWT程序 ... -
SWT/JFace专题 --- SWT API 结构
2013-02-23 18:31 1081SWT API 结构 1.布局类(l ... -
Eclipse启动过程(源码级剖析)
2013-02-20 03:24 3423双击eclipse安装目录下的eclipse.exe运行后,会 ... -
SWT/JFace专题 --- SWT结构浅析
2013-02-23 17:02 1025SWT技术是一套基于Java的 ... -
Eclipse平台体系结构
2013-02-21 23:56 18951.Eclipse平台体系结构 1 ... -
RCP平台架构
2013-02-23 14:11 1489RCP 富客户端通常是指具有独立用户界面的客户端程序。富客户 ... -
Ant构建脚本相关
2013-02-18 01:26 0Ant构建脚本相关 -
CDT源码架构研究
2013-02-18 01:24 0CDT源码架构研究
相关推荐
在SWT中,我们可以使用`Display.asyncExec`或`Display.syncExec`方法来在事件调度线程中执行代码,而使用`new Thread()`来创建并启动新的后台线程来执行耗时任务。以下是一个基本的示例: ```java Button button = ...
这意味着所有对SWT组件的操作(包括创建、更新或销毁)都必须在UI主线程中执行。当开发者尝试在非UI主线程中直接访问或修改SWT组件时,就会触发`SWTException`异常,具体错误信息为“Invalid thread access”。 ...
这是因为`launch`方法是在新线程中执行,而不是在Eclipse的UI线程中。在非UI线程中直接操作UI组件会导致错误。为了解决这个问题,开发者可以使用`Display.asyncExec`来异步执行UI更新代码。这段代码确保了在Eclipse...
### 使用Eclipse RCP进行桌面程序开发:详细指南 #### 一、Eclipse RCP简介与快速起步 **Eclipse RCP** (Rich Client Platform) 是一种基于Java的开源框架,用于开发桌面应用程序。自从Eclipse 3.0版本以来,RCP...
将`HelloWorldAction`类与`plugin.xml`关联,使得在Eclipse界面中可以访问这个动作。在`plugin.xml`的`extension`标签中,添加`command`元素来定义命令,再通过`handler`元素将命令与`HelloWorldAction`关联。同时...
通常,使用Display.asyncExec()和Display.syncExec()方法来确保在正确的线程(即UI线程)中更新界面元素,防止出现线程安全问题。 **学习资源:** 博文链接提到的<https://jose-bing.iteye.com/blog/1264042>是一个...
1. GUI线程:在SWT中,所有对GUI的操作必须在事件调度线程(Event Dispatch Thread,EDT)中进行,以保证界面的同步更新和避免数据竞争。 2. 回调机制:使用`Display.asyncExec`或`Display.syncExec`方法来确保在...
2. **跨平台:** Java的"一次编写,到处运行"特性使得SWT程序可以在Windows、Linux、macOS等多平台上运行。 3. **丰富的组件库:** SWT提供了大量可自定义的控件,方便构建复杂的应用界面。 总的来说,利用Java SWT...
开发者可以通过`Display.syncExec()`或`Display.asyncExec()`方法在UI线程中执行任务。 除了基本的GUI组件,SWT还提供了许多高级功能,比如对话框(Dialogs)、表格(Table)、树形视图(Tree)、进度条...
例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...
在IT行业中,图形移动是一个广泛涉及的领域,尤其是在游戏开发、用户界面设计和动画制作等方面。这个名为"Graphics Moving Package"的压缩包可能包含了与Java编程语言中的SWT(Standard Widget Toolkit)库相关的...
为了实现异步处理,可以使用`Display.asyncExec`和`Display.syncExec`方法,它们能够在正确的线程上下文中执行回调。 ### 9. 高级特性 SWT还提供了许多高级特性,如拖放支持、打印功能、数据库访问、国际化和本地...
这篇博客文章“SWT应用的开发实例:没有使用到OSGi”可能是介绍如何在不依赖OSGi框架的情况下,使用SWT进行应用程序开发的具体步骤和实践案例。 OSGi(Open Service Gateway Initiative)是一种模块化系统,主要...
总结来说,SWT的多线程机制是通过Display类提供的`asyncExec`、`syncExec`和`timerExec`方法来实现的,它们允许开发者在不阻塞UI线程的情况下执行后台任务。理解和熟练运用这些方法是构建高效、响应性强的SWT应用的...