带有UI线程的Java SWT ProgressMonitorDialog

时间:2015-01-26 10:30:15

标签: java multithreading user-interface swt progressdialog

我希望向用户显示一个简单的进度监视器对话框,同时在应用程序的本地数据库中搜索一些数据并显示在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);
        }
    }

1 个答案:

答案 0 :(得分:0)

对于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)的调用意味着如果作业在几秒钟内没有完成,则作业将显示进度对话框。