如何避免 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的主要内容,如果未能解决你的问题,请参考以下文章

如何避免重复的工作?

DDoS攻击是啥?应该如何避免?

Mongodb 连接失败,怎么避免抛错影响正常流程

Java中,当的数据过大时,如何避免值的改变?

如何避免嵌套订阅超过两个级别

如何触发(不避免!) HttpClient 死锁