1

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

我对 SWT 应用程序中的 progressBar 有一点问题:

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

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

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

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

4

2 回答 2

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(...).

于 2013-05-22T09:05:56.067 回答
0

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

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

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

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

于 2013-05-17T16:03:41.730 回答