SWT - Poprawianie mojego ProgressMonitorDialog

Mam działający ProgressMonitorDialog, ale chcę się upewnić, że ustawiam go poprawnie.

Najpierw kod:

Metoda tworzenia okna dialogowego

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

Plik klasy

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

  }
}

Metoda wywołująca ProgressBar i uruchamiająca operację tworzenia pliku 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......  

Pytania:

Będąc ProgressMonitorDialog jest GUI, musi być wykonany w Display.getDefault (). AsyncExec?

Jeśli ProgressMonitorDialog działa w osobnym wątku, jak wie, kiedy zamknąć operację?

Czy istnieje jakiś związek między paskiem postępu a operacją?

Mam rację zakładając, że pętla for w klasie ProgressBarThread jest w zasadzie zegarem, który utrzymuje monitor w stanie otwartym?

Czy istnieje sposób na zwiększenie szybkości wskaźnika ProgressMonitorDialog, można również usunąć przycisk anulowania?

To właśnie myślę, że dzieje się obecnie.

Zaczynam pasek postępu tuż przed uruchomieniem nasłuchu operacji PDFZobacz startSavePdfOperation () Powyżej

Pasek postępu działa jako nieznany, ale za pomocą pętli for utrzymuje okno dialogowe paska postępu otwarte, podczas gdy operacja jest uruchomiona na wątku w tle.
Zobacz Klasa ProgressBarThread powyżej

Po zakończeniu operacji PDF klasa operacji nasłuchuje zamknięcie podstawowego okna 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();
       }
    });
 }

}

Nie jestem pewien, co dzieje się z monitorem ProgressBarThread?

Czy to możliwe?

Gdy rozpocznie się operacja PDF, ProgressMonitorDialog otworzy się i uruchomi wskaźnik. OK z utrzymaniem tego nieznanego.

Po zakończeniu operacji PDF monitor zamyka się, a następnie podstawowy dialog

Chcę tylko otworzyć okno dialogowe paska postępu, które poinformuje użytkownika, że ​​jego żądanie działa w tle.

Jak stwierdzono powyżej, powyższy kod działa, ale obawiam się, że zamknięcie podstawowego interfejsu GUI, zniszczenie wątku postępu i monitora nie jest dobrą praktyką.

questionAnswers(1)

yourAnswerToTheQuestion