Raportowanie postępów

Zadania długotrwałe (trwające dłużej niż jedną sekundę) powinny raportować postęp do interfejsu IProgressMonitor przekazywanego do metody run zadania. W widoku postępu będącym częścią środowiska roboczego wyświetlane są wszystkie komunikaty dotyczące postępów oraz zakończone jednostki pracy przypisane do danego monitora.

Z dostarczanego monitora postępu należy również korzystać w przypadku żądań anulowania kierowanych z poziomu widoku postępu. Gdy użytkownik (lub moduł dodatkowy korzystający z interfejsu API) próbuje anulować zadanie, metoda isCanceled() interfejsu IProgressMonitor zwróci wartość true. Do zadania należy częste sprawdzanie stanu anulowania i reakcja na anulowanie przez jak najszybsze opuszczenie metody run po wykryciu anulowania. Następująca metoda run raportuje postęp i reaguje na anulowanie zadania:

            public IStatus run(IProgressMonitor monitor) {
final int ticks = 6000;monitor.beginTask("Doing some work", ticks);  try {
for (int i = 0; i < ticks; i++) {if (monitor.isCanceled())return Status.CANCEL_STATUS;monitor.subTask("Processing tick #" + i);// wykonywanie określonej pracymonitor.worked(1);         }
   } finally {
monitor.done();      }
return Status.OK_STATUS;
}

Metoda beginTask służy do określenia nazwy zadania w odpowiednim widoku postępu i ustalenie łącznej ilości pracy do wykonania, aby można było mierzyć postęp. Komunikat subTask będzie wyświetlany jako element potomny w drzewie postępu w miarę wykonywania pracy. Procentowe ukończenie będzie obliczane na podstawie ilości pracy zgłoszonej w wywołaniach worked.

Monitory postępu i interfejs użytkownika

Klasa IProgressMonitor została zaprojektowana z myślą o obsłudze odpowiedniego interfejsu użytkownika. Moduł dodatkowy interfejsu użytkownika platformy udostępnia obsługę wyświetlania postępu wykonywanych zadań w środowisku roboczym. Zadania można konfigurować pod tym kątem, określając sposób ich prezentacji.

Aby uzyskać szczegółowe informacje na temat dostępnych interfejsów API służących do wyświetlania postępu zadania, należy zapoznać się z sekcją Obsługa współbieżności w środowisku roboczym.

Zadania systemowe

Jakie podejście należy zastosować w przypadku, gdy zadanie jest szczegółem implementacji niskiego poziomu, którego nie należy ujawniać użytkownikom? Można oznaczyć zadanie jako zadanie systemowe. Zadanie systemowe zachowuje się jak każde inne zadanie, z tym że odpowiadający mu interfejs użytkownika nie konfiguruje widoku postępu ani nie wyświetla elementów wizualnych związanych z wykonywaniem zadania. Jeśli zadanie nie jest bezpośrednio inicjowane przez użytkownika ani nie jest zadaniem okresowym, które mogłoby być konfigurowane przez użytkownika, należy oznaczyć je jako zadanie systemowe. Protokół służący do ustawiania zadania systemowego jest prosty:

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Trivial Job");
         setSystem(true);
      }
      ...
   }

Przed zaplanowaniem zadania należy przeprowadzić wywołanie setSystem. W razie podjęcia próby wykonania tego wywołania w odniesieniu do zadania, które jest aktualnie oczekujące, uśpione lub uruchomione, zostanie zgłoszony wyjątek.

Zadania użytkownika

Jeśli zadanie jest długotrwałą operacją inicjowaną przez użytkownika, należy oznaczyć je jako zadanie użytkownika. Zadanie użytkownika będzie wyświetlane w modalnym oknie dialogowym z przyciskiem umożliwiającym przeniesienie okna na drugi plan. W środowisku roboczym można określić preferencję użytkownika, od której zależy, czy omawiane okna dialogowe są w ogóle wyświetlane jako okna modalne. Oznaczenie zadania jako zadania użytkownika powoduje, że informacje dotyczące postępu dostosowują się automatycznie do preferencji użytkownika określających sposób sygnalizowania postępu. Protokół służący do ustawiania zadania użytkownika jest podobny do poprzedniego przykładu:

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Trivial Job");
         setUser(true);
      }
      ...
   }

Wywołanie metody setUser należy również przeprowadzić przed zaplanowaniem zadania.

Grupy postępu

Grupy postępu to kolejny mechanizm, który można zastosować w celu określenia sposobu prezentacji zadania w interfejsie użytkownika. Jeśli w danej sytuacji najodpowiedniejszym sposobem prezentacji jest wyświetlenie zbiorczego postępu kilku powiązanych ze sobą zadań, można utworzyć specjalny interfejs IProgressMonitor, który reprezentuje taką grupę. Monitor ten tworzy się przy użyciu protokołu IJobManager. Utworzenie grupy postępu i powiązanie jej z zadaniem zilustrowano w poniższym fragmencie kodu.

   ...
   IJobManager jobMan = Platform.getJobManager();
myGroup = jobMan.createProgressGroup();job.setProgressGroup(myGroup, 600);  // należy określić jednostki pracy, które sygnalizować ma zadaniejob.schedule()   ...

Funkcja grup pozwala modułom dodatkowym dzielić czynności na wiele zadań, ale raportować je użytkownikowi w taki sposób, jakby stanowiły ciągle jedną czynność. Monitor grupy postępu przejmuje szczegóły związane z obliczaniem procentowego ukończenia wszystkich zadań w grupie.

Zadanie należy umieścić w grupie postępu przed jego zaplanowaniem. Po zakończeniu zadania jego odwołanie do grupy postępu jest usuwane. Jeśli wystąpi konieczność ponownego zaplanowania zadania, należy najpierw ponownie umieścić je w grupie.