SWT - 调整我的ProgressMonitorDialog

时间:2012-12-19 17:11:01

标签: swt progressmonitor

我有一个有效的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在一个单独的线程中运行,那么当操作finsihed时它如何知道关闭?

  3. 进度条和操作之间是否有任何关系?

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

  5. 有没有办法提高ProgressMonitorDialog指标的速度,还可以删除取消按钮吗?

  6. 这正是我目前正在思考的问题。

    1. 我在启动PDF操作侦听器之前启动进度条 请参阅

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

    4. 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();
             }
          });
       }
      

      }

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

    6. 这可能吗?

      1. 当PDF操作开始时,ProgressMonitorDialog将打开并启动指示器。好吧,保持不知名。

      2. PDF操作完成后,监视器将关闭,然后是基本对话框

      3. 我只想打开进度条对话框,告知用户他们的请求在后台运行。

        如上所述,上面的代码可以正常工作,但我担心通过关闭Base GUI,破坏我的Progress Thread和Monitor并不是一个好习惯。

1 个答案:

答案 0 :(得分:3)

首先,在您的ProgressBarThread#run()中,您应该使用monitor.worked(1)。您不需要设置总工作量,但是从上次调用后的工作量增加它。

Q1。是的,它需要在显示线程中执行 Q2。通常,需要完成的工作实际上是在传递给进度监视器对话框的runnable中执行的,这样您就可以准确地报告所取得的进度。因此,应该从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),我可以更好地回答。