SWT / Swing - >线程n'地狱

时间:2011-10-22 05:06:49

标签: java multithreading swing swt

我有一个SWT应用程序。我对SWT感到沮丧,因为没有让我很容易做我想做的事情。所以我用了Swing。 Swing让我的生活变得轻松。好极了。除了现在,两人不得不谈。问题是,它们在不同的线程上运行,每当我尝试从Swing运行SWT GUI方法时,我得到:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access

哦,快乐。那么,我该如何解决这个问题呢?如果这是Objective-C,我可以使用:

- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

但事实并非如此,所以我不能。有没有办法在线程B上运行方法A?当该线程存在时?

1 个答案:

答案 0 :(得分:4)

我没有使用SWT,但似乎SWT会严格禁止访问非UI线程中的SWT对象。您可以将请求排队以与SWT上的对象进行通信。

This链接更好地解释了

该示例建议您使用syncExec

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

我可以假设这会在主SWT UI线程上排队Runnable,因此访问是合法的。

注意:我再次阅读链接,syncExec将最终冻结你的Swing EDT。如果您调用syncExec,它将在SWT队列上抛出Runnable并等待它完成。您可以查看asyncEvent以将runnable抛出队列并继续工作。