我有一个 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?该线程何时存在?
最佳答案
我没有太多使用 SWT,但似乎 SWT 将严格禁止在非 UI 线程中访问 SWT 对象。您可以将与 SWT 上的对象对话的请求排队。
This链接更好地解释了这一点
该示例建议您使用syncExec
display.syncExec(
new Runnable() {
public void run(){
label.setText(text);
}
});
我可以假设这会将 Runnable 在主 SWT UI 线程上排队,因此访问是合法的。
注意:我再次阅读了该链接,syncExec 最终会卡住您的 Swing EDT。如果调用syncExec,它将把Runnable 扔到SWT 队列上并等待它完成。您可以查看 asyncEvent 将可运行对象放入队列中并继续工作。
关于java - SWT/Swing -> 线程 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857531/