`

SWT图形界面开发中多线程的使用

阅读更多
一、场景
开发java桌面应用大都会带有图形界面,带有图形界面的java程序一般都会有专门负责图形界面渲染、用户输入事件的UI线程,比如swing中的awt线程,swt/jface中的swt线程。

这里主要说一下swt中关于界面的多线程。
桌面程序开发过程中,难免遇到耗时很长的任务,如果放到UI线程中处理,会有界面假死的感觉,用户体验很不好。常用的解决办法就是为这个耗时的任务开辟一个新线程,放到后台去处理,保证界面操作的流畅;后台任务完成后,图形界面获得通知,做出相应的响应。但这种方法在SWT中如何实现呢?

二、问题
SWT在设计上不支持多线程,就是说在非UI线程中调用UI对象是不允许的,若要访问UI界面上的对象必须通过UI线程来访问。SWT在设计上保证在一个线程中使用,这是出于线程安全的考虑。大家可以深入研究一下这么做的目的,我的理解是SWT需要手动释放资源,不想swing那样使用AGC,所以不像swing那样支持多线程。

如果我们从非UI线程去操作UI界面会有什么结果呢?运行下面的代试一下:
package designer;

import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;

public class MultiThreadTest extends ApplicationWindow {
	Text text;

	public MultiThreadTest() {
		super(null);
	}

	public Control createContents(Composite parent) {
		Shell shell = getShell();
		shell.setText("Where am I?");
		text = new Text(shell, SWT.NONE);
		text.setText("Hello world");
		return parent;
	}

	public static void main(String[] args) {
		MultiThreadTest main = new MultiThreadTest();
		main.setBlockOnOpen(true);
		Task task = new Task(main);
		task.start();
		main.open();
		Display.getCurrent().dispose();
	}
}

class Task extends Thread {
	private MultiThreadTest main;

	public Task(MultiThreadTest main) {
		this.main = main;
	}

	public void run() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e1) {
		}
		main.text.insert("Task begin...");
		for (int i = 0; i < 50; i++) {
			main.text.insert("processing " + i + " task...");
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
			}
		}
	}
}

正常情况下,应该抛出一个运行时错误:
Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access

三、解决方法
Display是突破口。Display作为SWT运行时的核心,管理GUI资源,与OS进行通信。
我们必须为更新GUI的任务开辟一个线程,交由UI线程去调用,而让UI线程调用其他任务的方法是通过Display对象:
http://hi.baidu.com/gridrender/blog/item/447c7d181121950135fa410d.html 写道

Display对象中负责调用其他线程的方法有以下3种:

   ● asyncExec(Runnable runnable):异步启动新的线程。所谓异步就是,UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。
   ● syncExec(Runnable runnable):同步启动新的线程。所谓同步就是,UI线程会等待runnable对象执行结束后才会继续进行,当runnable对象是耗时大的线程时,尽量不要采用此种方式。另外,对于该种方式创建的线程可通过getSyncThread()方法获得线程对象。
   ● timerExec(int milliseconds,Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。当然用此方法创建的线程启动后,与UI线程是异步的。如果指定的时间为负数,将不会按时启动线程。

另外Display对象中,与UI线程相关的方法如下所示:
   ● 获得当前的UI线程对象的方法:getThread(),返回Thread对象。
   ● 使UI线程处于休眠状态:sleep()。
   ● 唤醒UI线程:wake()。

3.1获得Display对象
非UI线程可以通过Display.getDefault()获得。如果之前全局中存在Display对象则直接获得;如果之前没有Display对象存在(如SWT之前没调用Display.getDefault()方法,JFace的ApplicationWindow还没有open()),则该线程编程UI线程。
3.2调用策略
暂把为处理耗时任务而开辟的线程叫做任务线程。有两种策略来处理:一是在触发该任务线程时由Display对象启动任务线程(但是这样相当于耗时的任务在UI线程中运行了,界面还是会假死。);二是任务线程中需要更新界面时,通过Display对象启动包含更新动作的新线程。


四、更好的方法
利用SWT的Action和Contribution。
2
2
分享到:
评论

相关推荐

    GPS实时定位,SWT图形界面

    总的来说,实现GPS实时定位,SWT图形界面涉及到的技术点包括GPS定位原理、SWT库的使用、事件驱动编程、多线程(因为位置更新可能在后台线程中进行),以及可能的地图API集成。通过这样的应用,用户可以直观地查看到...

    局域网聊天 SWT Java 多线程问题已经解决

    SWT是Eclipse基金会提供的一个开源GUI库,它为Java开发者提供了与操作系统更紧密集成的图形界面。 首先,我们需要理解局域网聊天的核心概念。局域网(Local Area Network)是指在有限地理范围内的计算机网络,允许...

    swt 多线程

    在开发SWT应用程序时,尤其是在RCP(Rich Client Platform)环境中,多线程处理是常见的需求,以确保用户界面的响应性和程序的高效性。本文将深入探讨SWT中多线程的使用,特别是与UI交互相关的多线程原理。 首先,...

    swt页面后台多线程接受ModBUS协议Socket通讯的数据

    标题"swt页面后台多线程接受ModBUS协议Socket通讯的数据"表明,我们正在讨论一个基于SWT的Java图形用户界面(GUI),该界面的后台使用多线程技术来处理通过Socket接收的遵循ModBUS协议的数据。这样的设计允许用户...

    swt线程冲突与解决

    在使用SWT(Standard Widget Toolkit)进行图形界面开发时,开发者往往会遇到一个常见的问题——线程冲突。由于SWT组件的设计原则是基于单线程模型,即所有的UI操作必须在UI主线程中执行,因此在多线程环境下容易...

    java socket多线程聊天

    SWT(Standard Widget Toolkit)是用于创建图形用户界面(GUI)的一种库,它为开发者提供了丰富的控件和窗口组件,使得聊天应用程序具有更加直观和友好的用户交互体验。 **Java Socket编程**: Java Socket是Java...

    使用Eclipse进行SWT编程

    ### 使用Eclipse进行SWT编程 #### 1. 为何选择SWT? SWT(Standard Widget Toolkit),由IBM开发的一套跨平台GUI开发框架,在Java领域内占据着重要的位置。SWT之所以诞生,主要是为了解决Java早期GUI框架中存在的...

    swt64位和32位jar包4.3版本可用

    开发者通常会将这些jar文件添加到项目的类路径中,以便在代码中使用SWT的API。 在压缩包的文件名称列表中,"swt64ª∞32ª∞jarÑ]4.3¬⌐Ñ╗"看起来像是经过某种编码或加密的文件名,可能包含了64位和32位的SWT库...

    swt 监控代码资料

    综上所述,“swt 监控代码资料”可能涵盖了SWT的基本使用、组件交互、图形绘制、性能监控等多个方面,对于理解和开发SWT应用程序具有重要的参考价值。通过深入学习这些知识点,开发者可以构建出功能强大、性能优异的...

    swt源码以及jar

    SWT(Standard Widget Toolkit)是Eclipse项目中的一个开源库,用于构建图形用户界面(GUI)。它是Java应用程序中的一种替代AWT和Swing的GUI工具包,特别适用于开发跨平台的应用程序,因为SWT在各个操作系统上实现了...

    全屏的SWT多媒体播放器

    SWT(Standard Widget Toolkit)是Java编程环境中用于创建图形用户界面(GUI)的一种库,它由Eclipse基金会维护。在SWT中,开发者可以构建功能丰富的应用程序,包括多媒体播放器。全屏的SWT多媒体播放器是利用SWT库...

    Java swt完整教程

    Java SWT(Standard Widget Toolkit)是Java编程环境中用于创建桌面应用程序的一种图形用户界面(GUI)工具包。它是Eclipse基金会的一部分,提供了与操作系统本机UI组件紧密集成的能力,使得开发出的程序具有原生...

    SWT深入内幕之消息机制探秘.pdf

    ### SWT深入内幕之消息机制探秘 #### 一、引言 SWT(Standard Widget Toolkit)作为一种...总之,SWT通过对Windows消息机制的深入探索和创新,为Java开发者提供了一个高效、可靠且易于使用的图形用户界面开发工具包。

    swt入门学习资料

    同时,SWT 可以与 JFace 和 Eclipse RCP 结合使用,构建更复杂的图形用户界面和企业级应用。 总的来说,SWT 是 Java GUI 开发的一个强大选择,尤其适合那些需要原生外观和高性能的应用。对于初学者来说,理解 SWT ...

    基于swt的小软件

    例如,使用`Display.asyncExec`或`Display.syncExec`方法在GUI线程中更新界面,确保界面操作的线程安全。 **Bank子文件** 在"Bank"这个子文件中,很可能是实现了一款与银行相关的模拟软件,可能包括账户管理、交易...

    Eclipse之SWT编程

    SWT(Standard Widget Toolkit)是IBM为解决Java GUI开发中的一些固有问题而设计的一套跨平台图形用户界面开发框架。在Java GUI的历史进程中,Sun公司曾推出AWT(Abstract Windowing Toolkit)框架,用以实现跨平台的...

    java swt 跳棋程序 源码

    通过这个跳棋程序,开发者不仅能掌握SWT的基本使用,还能锻炼到游戏逻辑设计、用户交互实现以及多线程处理等多方面的技能。对于想要深入Java GUI编程或者游戏开发的初学者来说,这是一个很好的实践项目。

    swt心得体会

    在Java图形用户界面开发中,SWT(Standard Widget Toolkit)是一个重要的库,它是Eclipse项目的一部分,提供了丰富的本地化图形组件。SWT的出现是对AWT(Abstract Window Toolkit)和Swing的补充,特别是对于那些...

    swt

    `SWT线程.pdf`文件可能是详细讲解SWT中线程管理的教程,可以帮助读者深入理解如何在SWT应用中正确处理多线程。 总的来说,SWT是一个强大且灵活的GUI库,对于希望开发高性能、原生感的Java桌面应用的开发者来说,是...

Global site tag (gtag.js) - Google Analytics