浏览 4474 次
锁定老帖子 主题:解决SWT中事件响应的线程冲突问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-27
我们会在一个业务的监听器中将我们需要进行设置(重绘)的SWT组件从其构造函数中传过去: java 代码
这里做下说明,ServiceListener是我们自己实现的一个实现了javax.management.NotificationListener 接口的Listener ,它必须实现其handleNotification方法,而txtInformation是一个swt.Text的组件。我们想当然的在这个方法中做一些跟SWT有关的操作于是我们将这个Text组件传进去,再在响应事件中对其进行操作。 java 代码
我们期待的是,当我们期待的事件发生后,会触发这个响应事件做出响应,而我们在已有的SWT界面上的TEXT组件的值会发生改变。但事实上事件是触发了,但程序走到 “txtInformation.setText(result); ”这一行的时候无端停住了,并报了个异常。单我们但不跟踪并查看SWT的源代码的时候看到Text组件中的setText方法是这样写的: java 代码
其中checkWidget ();方法引起了我们的注意,进去看看: java 代码
看见没有,事实上这里明显的是不能在多个线程中对同一个SWT组件进行操作,从ibm developerworks上了解到:Java语言本身就提供了多线程机制,这种机制对GUI编程来说是不利的,它不能保证图形构件操作的同步与串行化。SWT采用了一种简单而直接的方式去适应本地GUI系统对线程的要求:在SWT中,通常存在一个被称为"用户线程"的唯一线程,只有在这个线程中才能调用对构件或某些图形API的访问操作。如果在非用户线程中程序直接调用这些访问操作,那么SWTExcepiton异常会被抛出。 那么怎么解决这个问题了,按照developerworks提出的方案,我们对我们的之前写的程序稍微做了一些改进: java 代码
很好程序如我们所期待的那样做出了反应。问题解决了。总结一下也就是 SWT的在对其组件进行操作的时候有一个单线程的约束,直接的赋值方式是行不通的,SWT在*.widget.Display类中提供了两个方法可以间接 的在非用户线程的进行图形构件的访问操作,这是通过的syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现 的。而方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回,而后者则无论指定的线程是否执行都会立即返回到 当前线程。 enjoying! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |