首先,我对我的英语水平感到抱歉,我是西班牙语。
我对SWT应用程序中的progressBar有一点问题:
我的问题是,当我尝试从我的UploadThread更新invalid thread access
时,我收到了ProgressBar.Selection(int)
。
我正在努力解决这个问题,使用Timertask(我想每秒上传我的progressBar),有事件(当UploadThread保持活动状态时会触发事件)但是它不起作用。
我希望你能帮我解决这个问题。
答案 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更新。