【问题标题】:SWT - Tweaking my ProgressMonitorDialogSWT - 调整我的 ProgressMonitor 对话框
【发布时间】:2012-12-20 19:07:43
【问题描述】:

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

首先是代码:

Dialog的创建方法

 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 操作完成后,监视器关闭,然后是基本对话框

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

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

【问题讨论】:

    标签: swt progressmonitor


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • Operation 实际上是一个 AbstractAIFOperation。 Operation 类有一个 executeOperation 方法,可以创建 XML 代码并运行一些服务器端命令。开始怀疑我是否只是从操作类而不是 GUI 类运行进度条。我也想知道是否有办法将进度条放在操作监听器中。
    • 谷歌搜索 AbstractAIFOperation 没有找到任何东西。但正如我所说,您应该从 ProgressBarThread 的 run 方法创建和调用您的操作。
    猜你喜欢
    • 1970-01-01
    • 2011-12-03
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多