SWT - Meinen ProgressMonitorDialog optimieren

Ich habe einen funktionierenden ProgressMonitorDialog, möchte aber sicherstellen, dass ich ihn richtig einstelle.

Zuerst der Code:

Methode zum Erstellen eines Dialogs

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

Klassendatei

 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();

  }
}

Methode, die die ProgressBar aufruft und einen Vorgang zum Erstellen einer PDF-Datei ausführt

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......  

Fragen:

Da der ProgressMonitorDialog eine grafische Benutzeroberfläche ist, muss er in einem Display.getDefault () ausgeführt werden. AsyncExec?

Wenn der ProgressMonitorDialog in einem separaten Thread ausgeführt wird, woher weiß er, dass er geschlossen werden muss, wenn der Vorgang abgeschlossen ist?

Gibt es eine Beziehung zwischen der Fortschrittsanzeige und der Operation?

Ich gehe zu Recht davon aus, dass die for-Schleife in der ProgressBarThread-Klasse im Grunde der Timer ist, der den Monitor offen hält.

Gibt es eine Möglichkeit, die Geschwindigkeit der ProgressMonitorDialog-Anzeige zu erhöhen? Können Sie auch die Abbrechen-Schaltfläche entfernen?

Dies ist, was ich denke, geschieht derzeit.

Ich starte den Fortschrittsbalken, kurz bevor ich den PDF Operation Listener starteSiehe startSavePdfOperation () oben

Der Fortschrittsbalken wird als unbekannt ausgeführt, verwendet jedoch eine for-Schleife, um den Fortschrittsbalkendialog geöffnet zu halten, während der Vorgang in einem Thread im Hintergrund ausgeführt wird.
Siehe Klasse ProgressBarThread oben

Wenn die PDF-Operation abgeschlossen ist, schließt die Listener-Operationsklasse das Basis-GUI-Dialogfeld.

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

}

Ich bin nicht sicher, was mit dem ProgressBarThread-Monitor passiert.

Ist das möglich?

Wenn der PDF-Vorgang gestartet wird, wird der ProgressMonitorDialog geöffnet und der Indikator gestartet. OK, es unbekannt zu halten.

Wenn der PDF-Vorgang abgeschlossen ist, wird der Monitor und anschließend das Basisdialogfeld geschlossen

Ich möchte nur den Fortschrittsbalkendialog öffnen, der den Benutzer darüber informiert, dass seine Anforderung im Hintergrund ausgeführt wird.

Wie bereits erwähnt, funktioniert der obige Code, aber ich befürchte, dass das Schließen der Basis-GUI, das Zerstören des Progress-Threads und des Monitors keine gute Praxis ist.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage