关于SWT线程异常

来源:互联网 发布:python 符号替换 编辑:程序博客网 时间:2024/04/30 19:45

        由于最近对开发RCP(Rich Clent Platform)的热衷,使我开始从完全从Swing转向SWT/JFace的GUI开发(看来我买的那本Java Swing<O'REILLY>可以拿来做枕头了),一方面SWT带给我们是更近平台且更高速的图形界面,另一方面也给我们这些熟悉了Swing的有的不适应。

        这是我最近开发基于SWT/JFace程序所参考到的书:《SWT.A.Developers.Notebook》-O'REILLY,另外一本是《SWT JFace in action》-MANNING,但最重要的莫属SWT/JFace的api帮助文档了,有了这些工具我想大家就可以开发一个界面美观的App了,还不要忘记了我们还有www.google.com,所以大家可以自行去下载

        说了那么多废话给原归正传了,如果大家用Swing开发过基于线程间通讯的话,一般会有一下三种方法:1.使用存取方法获得线程输出主程序;2.采用轮询方法查看sub-thread信息;3.采用CallBack方法,也是我们最常用的方法;而但我用把回调用在SWT开发的时候却发现了奇怪的问题,异常如下:

    Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
   at org.eclipse.swt.SWT.error(SWT.java:2942)
   at org.eclipse.swt.SWT.error(SWT.java:2865)
   at org.eclipse.swt.SWT.error(SWT.java:2836)
   at org.eclipse.swt.widgets.Widget.error(Widget.java:395)
   at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:298................

    而我的代码是这样的:

    loginbutton.addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() {
     public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
     .............
     feedBackLabel = new Label(main, SWT.NONE);
     ..................
     
     lt=new LoginThread(feedBackLabel);
     display.syncExec(lt);
     t=new Thread(lt);
     t.start();
     ...............

     线程LoginThread的run方法如下:mf是指向主线程传过来的feedBackLabel

     public void run() {
     try {
         mf.setText("连接中...");
     ......................
     }
     ...................

     但这个问题我在Swing开发中却不曾遇到过,后来我再网上找到了相关问题的解释:如果是在非UI线程中调用UI,SWT就会抛出一个SWTException.大家知道我们主程序中会要到Display display = Display.getDefault();UI线程就是创建Display的那个线程.而子线程不是display所对应的UI线程,解决办法就是调用Display.syncExec(Runnable)或Diaplay.asyncExec(Runnable),产生user-interface 线程调用runnable里面的run方法,而不是用new 一个Thread去运行

原创粉丝点击