Lang andauernde Jobs (länger als eine Sekunde) sollten den Verarbeitungsfortschritt an IProgressMonitor melden, das wiederum an die Methode run des Jobs übermittelt wird. Die Sicht für den Verarbeitungsfortschritt der Workbench zeigt alle Statusnachrichten und Einheiten beendeter Arbeitsschritte an, die diesem Überwachungsprogramm übermittelt werden.
Das bereitgestellte Fortschrittüberwachungsprogramm sollte auch verwendet werden, um zu überprüfen, ob die Sicht für den Verarbeitungsfortschritt Abbruchanfragen ausgegeben hat. Wenn ein Benutzer (oder ein Plug-in, das Job-API verwendet) versucht, einen Job abzubrechen, gibt die Methode IProgressMonitor isCanceled() den Wert true zurück. Es fällt in die Zuständigkeit des Jobs, den Abbruchstatus eines Jobs regelmäßig zu überprüfen. Als Reaktion auf einen Abbruch muss die Methode run so schnell wie möglich verlassen werden. Die folgende Methode run berichtet über den Verarbeitungsfortschritt und reagiert auf einen Jobabbruch:
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); //... do some work ... monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
Über die Methode beginTask wird die Task in der entsprechenden Sicht für den Verarbeitungsfortschritt benannt. Außerdem bestimmt sie die Gesamtmenge an Arbeit, die ausgeführt werden muss, damit die Sicht den Fortschritt berechnen kann. Die Nachrichten subTask erscheinen während der Ausführung der Arbeitsschritte als untergeordnetes Element der Fortschrittsbaums. Die Sicht für den Verarbeitungsfortschritt berechnet einen prozentualen Fortschritt auf Basis der in den Aufrufen worked gemeldeten Menge an Arbeitsschritten, und zeigt diesen Wert an.
Wie Sie sehen, wurde die Klasse IProgressMonitor
mit Hinblick auf die entsprechende Benutzerschnittstelle entworfen. Das Benutzerschnittstellen-Plug-in der Plattform bietet die entsprechende Unterstützung, so dass die Workbench den Fortschritt laufender Jobs anzeigen kann. Dies sollten Sie bei der Definition Ihrer Jobs im Hinterkopf behalten, und die Darstellung entsprechend steuern.
Unter Workbench-Unterstützung für gemeinsamen Zugriff
finden Sie eine detaillierte Betrachtung der APIs, die für eine Fortschrittsanzeige für Jobs zur Verfügung stehen.
In manchen Fällen handelt es sich bei einem Job aber auch um Implementierungsdetails auf einer niedrigen Ebene, die Sie dem Benutzer nicht unbedingt anzeigen wollen. Solche Jobs können Sie als Systemjobs markieren. Ein Systemjob unterscheidet sich von anderen Jobs lediglich dahingehend, dass die entsprechende Unterstützung der Benutzerschnittstelle weder eine Sicht für den Verarbeitungsfortschritt erstellt, noch sonstige mit der Ausführung des Jobs verbundene Anweisungen anzeigt. Wenn Ihr Job nicht direkt durch einen Benutzer oder eine regelmäßige, von einem Benutzer konfigurierte Task initiiert wird, sollte er als Systemjob definiert sein. Das Protokoll für die Definition eines Systemjobs ist einfach:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
Der Aufruf setSystem muss vor Terminierung dieses Jobs ausgeführt werden. Wenn Sie versuchen, diesen Aufruf für einen Job auszuführen, der zur Zeit wartet, inaktiv ist oder gerade läuft, wird eine Ausnahmebedingung ausgelöst.
Wenn es sich bei Ihrem Job um eine lang andauernde Operation handelt, die durch einen Benutzer initiiert wird, sollten sie ihn als Benutzerjob markieren. Ein Benutzerjob erscheint in einem modalen Fortschrittsdialog, der über eine Schaltfläche in den Hintergrund versetzt werden kann. Die Workbench definiert eine Benutzereinstellung, die steuert, ob diese Dialoge modal sein sollen. Wenn Sie Ihren Job als Benutzerjob definieren, entspricht die Fortschrittsrückmeldung automatisch der Benutzereinstellung für die Anzeige von Verarbeitungsfortschritten. Das Protokoll für die Definition eines Benutzerjobs ist ganz ähnlich:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
Der Aufruf setUser muss ebenfalls vor Terminierung dieses Jobs ausgeführt werden.
Fortschrittsgruppen stellen einen weiteren Mechanismus dar, über den die Anzeige eines Jobs in der Benutzerschnittstelle beeinflusst werden kann. Wenn es sich eher anbietet, den zusammengefassten Fortschritt mehrerer verbundener Jobs in der Benutzerschnittstelle anzuzeigen, kann ein spezieller IProgressMonitor erstellt werden, der eine Gruppe zusammenhängender Jobs darstellt. Dieses Überwachungsprogramm wird über das Protokoll IJobManager erstellt. Der folgende Ausschnitt zeigt, wie eine Fortschrittsgruppe erstellt und eine Zuordnung zu Jobs durchgeführt wird.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show. job.schedule() ...
Über das Gruppentool können Plug-ins Tasks bei Bedarf in mehrere Jobs herunterbrechen, sie dem Benutzer aber als eine einzige Task anzeigen. Das Überwachungsprogramm für Fortschrittsgruppen übernimmt die Details der Berechnung des prozentualen Fortschritts im Verhältnis zu allen Jobs der Gruppe.
Ein Job muss für seine Terminierung in einer Fortschrittsgruppe platziert werden. Nachdem die Ausführung eines Jobs beendet ist, wird der Verweis auf eine Fortschrittsgruppe wieder verloren. Wenn der Job erneut terminiert werden soll, so muss er der Gruppe vor Terminierung erneut zugewiesen werden.