如何避免 org.eclipse.swt.SWTException: Invalid thread access
Posted
技术标签:
【中文标题】如何避免 org.eclipse.swt.SWTException: Invalid thread access【英文标题】:How to avoid org.eclipse.swt.SWTException: Invalid thread access 【发布时间】:2014-12-16 23:24:47 【问题描述】:我有一个 SWT 按钮的监听器,它的开头是这样的:
button1.addSelectionListener(new SelectionAdapter()
@Override
public void widgetSelected(SelectionEvent e)
Runnable runnable = new Runnable()
public void run()
String nextValue = text1.getText();
...
我需要 UI 中名为 text1 的文本字段的当前值,但最后一行 getText() 失败并显示
org.eclipse.swt.SWTException: Invalid thread access
我知道 syncExec/asyncExec(我的代码有几个),但 *** 的其他线程建议您只需要在要更新 UI 中的字段时使用它。在侦听器中读取 UI 字段的正确方法是什么?
【问题讨论】:
与 SWT UI 对象的所有交互都必须在 UI 线程上运行,而不仅仅是更新。你为什么在这里使用Runnable
?
【参考方案1】:
这里有一些代码片段演示了如何同步和异步运行代码(复制自Lars Vogel's非常有用的站点)。
// Update the user interface asynchronously
Display.getDefault().asyncExec(new Runnable()
public void run()
// ... do any work that updates the screen ...
);
// Update the user interface synchronously
Display.getDefault().syncExec(new Runnable()
public void run()
// do any work that updates the screen ...
// remember to check if the widget
// still exists
// might happen if the part was closed
);
【讨论】:
呃.... 恕我直言,我告诉过你我知道 asyncExec,我的代码中有一些,所以我知道如何编写它们。这不是从我自己的 UI 中读取字段的方式。 @casgage SWT 是单线程的。(a)syncExec
是从非 UI 线程访问小部件的唯一方法 - 无论代码是“读取”还是“写入”小部件属性。如果其他 SO 线程声称只需要更新小部件,那么它们是错误的。这是SWT threading model 上的更多内容。
@david 只是想说(即使这个问题有点老了)这个答案是完全有效的,因为它帮助我解决了同样的问题。以上是关于如何避免 org.eclipse.swt.SWTException: Invalid thread access的主要内容,如果未能解决你的问题,请参考以下文章