2

我正在使用 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在 Display 线程内部没有以可靠的方式执行,这意味着有时它会进入 run 方法,而有时它不会,我尝试在run方法中放置断点并对其进行测试,但同样会发生。

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

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

4

1 回答 1

5

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

相反,使用类似的东西:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
于 2013-09-13T11:38:24.080 回答