我有一个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?当该线程存在时?
答案 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抛出队列并继续工作。