使用asyncExec后,在Eclipse视图运行方法中调用线程时出现问题。无效的线程异常

时间:2011-06-08 09:48:28

标签: multithreading eclipse eclipse-plugin eclipse-rcp

我正在观看日食。在视图中我添加了一个表。现在我使用asyncExec 从视图的run方法调用一个线程。

我的View类就像 -

public class SampleViewAction implements IWorkbenchWindowActionDelegate{

      Thread t;   

      int Count;


      @Override

      public void run(IAction arg0) {

 }
}

现在我添加了一个这样的线程 -

  PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {                   

                        @Override

                        public void run() {

                              new UDPReadThread();



                        }

                  });

其中UDPReadThread是一个类扩展了一个线程,在UDPReadThread的构造函数中我启动了该线程。 但是我得到了无效的Thread异常。

如何解决问题。

1 个答案:

答案 0 :(得分:1)

与AWT和EventDispatchThread类似,SWT必须处理UI线程中的所有内容。

您的SampleViewAction已在UI线程上运行,以响应菜单或工具项选择。

看起来您的问题来自于使用asyncExec(*),它将发布可在UI线程上运行的runnable(延迟它),并从中启动 new 线程asyncExec可运行。你也可以简单地开始你的线程,并摆脱asyncExec

您的UDPReadThread 不是 UI线程。如果您需要更新UDPReadThread的UI小部件,那就是需要asyncExec的代码:

display.asyncExec(
  new Runnable() {
    public void run(){
      label.setText(text);
    }
});

除此之外,你不应该继承Thread,除非你真的在扩展线程功能。当你想要启动另一个线程时的正常模式:

UDPReadRunnable udpRunnable = ....;
Thread thread = new Thread(udpRunnable);
thread.start();

您可以从http://www.eclipse.org/swt/faq.php#uithread

获取有关显示主题的更多信息