SWT中的无效线程访问(progressBar帮助)

时间:2013-05-15 15:44:45

标签: java swt progress-bar

首先,我对我的英语水平感到抱歉,我是西班牙语。

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

  1. 我有1个类(应用程序(SWT))包含所有控件(progressBar,textboxes,combos等)。
  2. 我有一个Thread类,它将文件上传到FTP服务器。
  3. 我的问题是,当我尝试从我的UploadThread更新invalid thread access时,我收到了ProgressBar.Selection(int)

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

如果您需要等待执行结果,请使用syncExec(...)代替asyncExec(...)

答案 1 :(得分:0)

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

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

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

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