Java SWT ProgressMonitorDialog with UI Thread



我想向用户显示一个简单的进度监视器对话框,同时在应用程序的本地数据库中搜索一些数据,并在UI中显示。

我目前使用ProgressMonitorDialog,其中我使用Display.getDefault().asyncExec在UI线程中执行搜索。现在搜索非常慢。显示进度对话框、在数据库中执行搜索并在不损失性能的情况下向用户显示结果的正确线程用法是什么。

 private void doSearchWithProgressDialog() {
        ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(null);
        try {
            progressDialog.run(true, true, new IRunnableWithProgress() {
                @Override
                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
                    // display progress monitor dialog while searching
                    monitor.beginTask("Waiting..."), IProgressMonitor.UNKNOWN);
                    Display.getDefault().asyncExec(new Runnable() {
                        @Override
                        public void run() {
                            // perform database query
                            doSearchAndDisplayResult();
                        }
                    });
                    monitor.done();
                }
            });
        }
        catch (InvocationTargetException e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
        catch (InterruptedException e) {
            log.error(e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

对于 Eclipse 插件或 RCP 中长时间运行的代码,请使用 Job

class MyJob extends Job
{
  public MyJob()
  {
    super("title");
    setUser(true);
  }
  @Override
  protected IStatus run(final IProgressMonitor monitor)
  {
    ... your code
    return Status.OK_STATUS;
  }
}

与:

Job myJob = new MyJob();
myJob.schedule();

调用setUser(true)意味着如果作业未在几秒钟内完成,则作业将显示进度对话框。

最新更新