Display.getDefault()。asyncExec无法正常运行

时间:2013-09-13 08:33:25

标签: java multithreading eclipse-plugin

我正在使用eclipse的作业API将大任务作为一项工作运行,一旦任务完成,我将布尔变量设置为true,如果该变量为true,我将在UI线程中执行WizardDialog。我目前的代码如下:

Job longRunningJob = new Job("Long running job...") {
    @Override
    protected IStatus run(IProgressMonitor monitor) {

        boolean shouldShowDialog = doLongRunningJob();

        if(shouldShowDialog) {
          Display.getDefault().asyncExec(new Runnable() {
               @Override
               public void run() {
                    //Will open wizard dialog here
                    WizardDialog wizardDialog = new WizardDialog(Display.getCurrent().getActiveShell(), new TestWizard());
                    wizardDialog.setBlockOnOpen(true);
                    wizardDialog.open();
               }
          });
        }
    }
}

longRunningJob.setUser(true);
longRunningJob.schedule();

我的问题是run里面的显示线程没有以可靠的方式执行,意味着它有时会进入run方法,有时候它没有,我尝试将断点放在run方法和测试中它出来了,但同样的事情发生了。

我的问题是,我正在做的是正确的方法吗?这是预期的行为吗?那么如何处理这种情况,即一旦shouldShowDialog为真,我如何在Display线程中执行代码?

编辑:我在调试时观察到的一个行为是对话框显示但突然关闭,我认为它正在退出线程。

1 个答案:

答案 0 :(得分:5)

消失对话框的问题最常见的原因是使用当前活动的Shell作为对话框的父级。例如。如果在创建对话框时打开ProgressDialog,则其他对话框将成为对话框的父对象。当另一个对话框关闭时,你的也是如此。

相反,请使用以下内容:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();