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 Operation Listener を開始する直前に進行状況バーを開始しています 上記の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 が開き、インジケーターが開始されます。不明のままでOK。

  2. PDF 操作が完了すると、モニターが閉じ、ベース ダイアログ

リクエストがバックグラウンドで動作していることをユーザーに通知するプログレスバーダイアログを開きたいだけです。

前述のように、上記のコードは機能しますが、ベース GUI を閉じてプログレス スレッドを破棄し、モニターを実行することはお勧めできません。

4

1 に答える 1

3

まず第一に、ProgressBarThread#run()あなたは使用する必要がありますmonitor.worked(1)。合計作業量を設定する必要はありませんが、最後に呼び出されてからの作業量だけ増分します。

Q1. はい、表示スレッド Q2 で実行する必要があります。通常、実行する必要がある作業は、進行状況モニター ダイアログに渡される実行可能ファイルで実際に実行されるため、進行状況を正確に報告できます。ProgressBarThread#run()そのため、1 つのファイル処理が完了したときにのみ 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 に答える