Vid långvariga jobbkörningar (där körningen varar längre än en sekund) bör förloppet rapporteras till IProgressMonitor som skickas till jobbets run-metod. Förloppsvyn i arbetsmiljön visar alla förloppsmeddelanden och enheter av slutförda arbeten som skickas till övervakaren.
Förloppsövervakaren bör också användas till att kontrollera om det finns begäran om att avbryta åtgärder från förloppsvyn. När en användare (eller ett insticksprogram med jobb-API) gör ett försök att avbryta ett jobb kommer IProgressMonitor-metoden isCanceled() att returnera true. Det är jobbets uppgift att ofta kontrollera avbrytningsstatus för ett jobb och besvara detta genom att köra metoden run så snart som möjligt när en avbrytning upptäcks. Följande run-metod rapporterar förlopp och besvarar avbrytning av jobb:
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;
}
Metoden beginTask används till att namnge uppgiften i motsvarande förloppsvy och att upprätta den totala mängd uppgifter som ska utföras så att förloppet kan beräknas i vyn. subTask-meddelanden visas som ett underordnat objekt i förloppsträdet vartefter arbetet fortskrider. I förloppsvyn beräknas och visas procentandelen slutfört arbete baserat på hur mycket arbete som rapporteras i anropen worked.
Som du ser är klassen IProgressMonitor
utformad med tanke på motsvarande användargränssnitt. Plattformens insticksprogram för användargränssnittet har funktioner som gör att arbetsmiljön kan visa förloppet för ett jobb som körs. Det kan du tänka på när du konfigurerar jobb, så att du kan styra hur de presenteras.
Mer information om de APIer som är tillgängliga för förloppsvisning finns i Funktioner för samtidighet i arbetsmiljön.
Hur ska du göra om jobbet är en detaljimplementering på låg nivå som du inte vill att andra användare ska se? Då kan du flagga jobbet som ett systemjobb. Ett systemjobb är precis som andra jobb, med undantag för att ingen förloppsvy visas eller annan information om körningen av ett jobb visas i motsvarande användargränssnitt. Om ditt jobb inte initieras direkt av en användare eller är en regelbunden uppgift som kan konfigureras av en användare bör det vara ett systemjobb. Protokollet för att ange ett systemjobb är enkelt:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
Anropet setSystem måste göras innan jobbet schemaläggs. Ett undantag utlöses om du försöker köra anropet för ett jobb som för tillfället väntar, vilar eller körs.
Om ditt jobb är ett åtgärd som körs länge och som initieras av en användare bör du flagga jobbet som ett användarjobb. Ett användarjobb visas i en modal förloppsdialogruta som har en knapp för att lägga dialogrutan i bakgrunden. I arbetsmiljön definieras en användarinställningen som styr om dialogrutorna alltid ska vara modala. När du definierar ditt jobb som ett användarjobb kommer förloppsfeedbacken att anpassas automatiskt till användarinställningarna för förloppsvisning. Protokollet för att ange ett användarjobb är likadant:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
Anropet setUser måste också göras innan jobbet schemaläggs.
Förloppsgrupper är en annan mekanism som kan användas till att påverka hur ett jobb ska visas i användargränssnittet. Om det är mer lämpligt att visa ett samlat förlopp för flera relaterade jobb i användargränssnittet går det att skapa en speciell IProgressMonitor som representerar en grupp av relaterade jobb. Den här övervakaren skapas med hjälp av protokollet IJobManager. Följande kodstycke visar hur du skapar en förloppsgrupp och associerar den med ett jobb.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // ange de arbetsenheter som jobbet ska visa. job.schedule() ...
Med gruppfunktionen kan insticksprogram dela upp uppgifter i flera jobb vid behov men rapportera dem till användaren som en enda uppgift. Förloppsgruppövervakaren hanterar detaljinformationen för beräkning av procentandelen slutfört arbete i förhållande till alla jobb i gruppen.
Ett jobb måste placeras i förloppsgruppen innan det schemaläggs. När körningen av ett jobb är slutförd försvinner jobbets referens till förloppsgruppen. Om jobbet ska schemaläggas igen måste det placeras i en grupp en gång till innan det schemaläggs.