Posted on 2006-02-21 17:01
fortune 阅读(1080)
评论(0) 编辑 收藏 所属分类:
java技术
多线程问题:SWT使用Display类来维护GUI及其使用的系统资源。它禁止用户在其他线程下访问GUI资源。例如:
public void run() {
butt.setText("test");
}
这样的写法会导致非法线程异常。如果需要在其他线程下访问GUI资源可以使用如下方法:
Display.getCurrent().asyncExec(new Thread () {
public void run() {
butt.setText("test");
}
})
- Display提供同步异步方法分别是: syncExec(Runnable)和asyncExec(Runnable)。
- 对于Display,在同一个线程里,不能申明2个Display实例。同样的,一个Display实例也不能跨线程使用。也就是说,如果你要在另外一个线程中显示一个窗体,你必须另外创建一个Display实例。不然会导致异常。)
线程问题
在任何操作平台的GUI系统中,对构件或一些图形API的访问操作都要被严格同步并串行化。例如,在一个图形界面中的按键构件可被设成可用状态(enable)或禁用状态(disable),正常的处理方式是,用户对按键状态设置操作都要被放入到GUI系统的事件处理队列中(这意味着访问操作被串行化),然后依次处理(这意味着访问操作被同步)。想象当按键可用状态的设置函数还没有执行结束的时候,程序就希望再设置该按键为禁用状态,势必会引起冲突。实际上,这种操作在任何GUI系统都会触发异常。
Java语言本身就提供了多线程机制,这种机制对GUI编程来说是不利的,它不能保证图形构件操作的同步与串行化。SWT采用了一种简单而直接的方式去适应本地GUI系统对线程的要求:在SWT中,通常存在一个被称为"用户线程"的唯一线程,只有在这个线程中才能调用对构件或某些图形API的访问操作。如果在非用户线程中程序直接调用这些访问操作,那么SWTExcepiton异常会被抛出。但是SWT也在*.widget.Display类中提供了两个方法可以间接的在非用户线程的进行图形构件的访问操作,这是通过的syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现的。例如:
//此时程序运行在一个非用户线程中,并且希望在构件panel上加入一个按键。
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
Button butt = new Button(panel,SWT.PUSH);
butt.setText("Push");
}
});
方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回,而后者则无论指定的线程是否执行都会立即返回到当前线程。