即使将所有SWT代码包装在" Display.getDefault().asyncExec
"中,我也无法更新我的用户界面。
假设我有一个叫做单击一个按钮的监听器。
Listener enterlisner = new Listener() {
@Override
public void handleEvent(Event event)
{
Display.getDefault().asyncExec(new Runnable()
{
public void run()
{
try
{
if((event.keyCode == SWT.CR || event.keyCode == 13 || event.type == SWT.Selection) && btnAdd.isEnabled())
{
new ProgressMonitorDialog(shell).run(true, true, new IRunnableWithProgress()
{
@Override
public void run(final IProgressMonitor monitor) throws InvocationTargetException,
InterruptedException
{
// method1()
// method2() {method2.1() , method2.2()}
// method3() {method3.1() , method3.2()}
// ....
// ...
// method10
}
});
}
}
catch (InvocationTargetException | InterruptedException e)
{
e.printStackTrace();
}
}
});
}
};
有人可以参考思考link并让我知道我错在哪里吗?
如何分割在后台线程中运行的一些方法?
答案 0 :(得分:2)
当您已经在UI线程中时,将整个代码包装在asyncExec
中基本上没有任何效果(除了一些非常专业的用途)。
您必须查看代码并识别在后台线程中运行的每个部分。对这些位置的UI操作的任何访问都必须在此时使用asyncExec(或syncExec)调用。
传递给IRunnableWithProgress
的{{1}}在后台线程中运行。因此,每次访问ProgressMonitorDialog
代码中的任何UI对象时,您都必须使用单独的IRunnableWithProgress
或asyncExec
来电。
类似于:
syncExec