0

我有一个可用的 ProgressMonitorDialog,但我想确保我正确设置它。

首先是代码:

创建对话框的方法

 public void startProgressBar() {
  try {
     new ProgressMonitorDialog(getShell()).run(true, true,
        new ProgressBarThread());
  } 
  catch (InvocationTargetException e) {
     MessageDialog.openError(getShell(), "Error", e.getMessage());
  } 
  catch (InterruptedException e) {
     MessageDialog.openInformation(getShell(), "Cancelled", e.getMessage());
  }
}

类文件

 class ProgressBarThread implements IRunnableWithProgress {
  private static final int TOTAL_TIME = 1000;

  public ProgressBarThread() {

  }

  public void run(IProgressMonitor monitor) throws InvocationTargetException,InterruptedException {
     monitor.beginTask("Creating PDF File(s): Please wait.....", IProgressMonitor.UNKNOWN);
     for (int total = 0; total < TOTAL_TIME ; total++) {
        Thread.sleep(total);
        monitor.worked(total);
        if (total == TOTAL_TIME / 2) monitor.subTask("Please be patient... Operation should finish soon.");
    }
    monitor.done();

  }
}

调用 ProgressBar 并运行 Pdf 文件创建操作的方法

private void startSavePdfOperation() {
  Display.getDefault().asyncExec(new Runnable() {
     public void run() {
        startProgressBar();
     }
  });
  saveOp = new AplotSaveOperation(appReg.getString("aplot.message.SAVETOPDF"), "PDF", session);
  saveOp.addOperationListener(new MyOperationListener(this) {

     public void endOperationImpl() {
        java.io.File zipFile = null;
        try {               
           AplotSaveResultsParser.SaveResult saveResults = saveOp.getSaveResults();
           if (saveResults != null) {
           ETC.....   ETC......  

问题:

  1. 由于 ProgressMonitorDialog 是一个 GUI,它需要在 Display.getDefault().asyncExec 中执行吗?

  2. 如果 ProgressMonitorDialog 在单独的线程中运行,它如何知道在操作完成时关闭?

  3. 进度条和操作有什么关系吗?

  4. 我假设 ProgressBarThread 类中的 for 循环基本上是保持监视器打开的计时器是正确的?

  5. 有没有办法提高 ProgressMonitorDialog 的指标速度,你也可以去掉取消按钮吗?

这就是我认为目前正在发生的事情。

  1. 我在启动 PDF 操作侦听器之前启动进度条 请参见上面的 startSavePdfOperation()

  2. 进度条以未知方式运行,但使用 for 循环保持进度条对话框打开,而操作在后台线程上运行。
    请参阅上面的 ProgressBarThread 类

  3. PDF 操作完成后,侦听器操作类将关闭基本 GUI 对话框。

    public void endOperation() {
     try {
        endOperationImpl();
     }
     finally {
        Display.getDefault().asyncExec(new Runnable() {
           public void run() {
              w.getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW));
              w.recursiveSetEnabled(getShell(), true);
              w.getShell().setEnabled(!getShell().getEnabled());
              w.close();
           }
        });
     }
    

    }

  4. 我不确定 ProgressBarThread 监视器发生了什么?

这可能吗?

  1. 当 PDF 操作开始时,ProgressMonitorDialog 打开并启动指示器。可以保持未知。

  2. PDF 操作完成后,监视器关闭,然后基本 Dialog

我只想打开进度条对话框,通知用户他们的请求正在后台工作。

如前所述,上面的代码有效,但我担心关闭基本 GUI 会破坏我的进度线程和监视器不是好的做法。

4

1 回答 1

3

首先,在你的ProgressBarThread#run()你应该使用monitor.worked(1). 您无需设置总工作量,而是将其增加自上次调用以来已完成的工作量。

Q1。是的,它需要在显示线程 Q2 中执行。通常,需要完成的工作实际上是在传递给进度监视器对话框的可运行文件中执行的,以便您可以准确地报告所取得的进度量。因此,您的操作(如果是同步调用)应该从内部调用,ProgressBarThread#run()以便仅在一个文件处理完成时调用 monitor.worked(1) 。

Q3。你在运行什么样的操作,也许它已经支持显示进度条,你只需要调用正确的API。是IUndoableOperation吗?

Q4。正如我所说,这种方法是有问题的,因为您永远无法准确地报告进度并仅在操作完成时关闭对话框。但是,如果这是您唯一的选择,那么您可以将monitor引用保存在某处,以便其他线程可以访问它。一旦monitor.done()被调用,你ProgressBarThread#run()应该返回,对话框将关闭。

Q5。您可以通过将正确的参数传递给来删除取消按钮ProgressMonitorDialog#run(..)

new ProgressMonitorDialog(getShell()).run(true, false, new ProgressBarThread());

对于其余的问题,如果我知道您使用的是哪种操作(什么 API),我可以更好地回答。

于 2012-12-20T11:07:43.623 回答