【问题标题】:Invalid thread access in SWT (progressBar help)SWT 中的无效线程访问(progressBar 帮助)
【发布时间】:2013-05-15 15:44:44
【问题描述】:

首先我很抱歉我的英语水平,我是西班牙人。

我对 SWT 应用程序中的进度条有点问题:

  1. 我有 1 个类(应用程序 (SWT)),其中包含所有控件(进度条、文本框、组合等)。
  2. 我有 1 个 Thread 类将文件上传到 FTP 服务器。

我的问题是,当我尝试从 UploadThread 更新我的 ProgressBar.Selection(int) 时,我收到了 invalid thread access

我正在努力解决这个问题,使用 Timertask(我想每秒上传我的进度条),使用事件(当 UploadThread 保持活动状态时触发一个事件),但它不起作用。

希望你能帮我解决这个问题。

【问题讨论】:

  • 你能分享你的代码吗?当我们尝试从非 gui 线程更新 swt gui 时,通常会发生无效的线程访问。

标签: java swt progress-bar


【解决方案1】:

当您使用 SWT 时,您必须记住对 SWT 对象的所有访问必须在 SWT UI 事件线程中执行。这有一些例外,但它们通常在 API 中注明或相当明显。

要对控件进行任何更改,请使用以下模板:

c.getDisplay().asyncExec(new Runnable() {
    @Override
    public void run() {
        if (c.isDisposed()) return;
        // ...
    }
});

这将尽快在事件线程中运行Runnable 对象。您甚至可以在事件线程本身中使用此构造,将工作推迟到以后 - 通常是为了获得快速的 UI 响应。

if (c.isDisposed()) return; 构造用于防止在执行asyncExec(...)run() 之间的时间内释放控件的情况。

如果您需要等待执行结果,请使用syncExec(...) 而不是asyncExec(...)

【讨论】:

    【解决方案2】:

    你是如何创建你的上传线程的?

    如果您的线程实现了IRunnableWithProgress 并且由实现IRunnableContext 的类运行,那么您的进度条应该可以在单独的线程中运行。

    只需为 run 方法上的 fork 参数指定 true。

    IRunnableWithProgress 上的 run 方法提供了一个 IProgressMonitor 供您的线程更新。

    【讨论】:

      猜你喜欢
      • 2018-04-11
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2015-04-24
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多