Job, der er længe om at blive udført (dem som varer mere end et sekund), bør rapportere om status til IProgressMonitor, som overføres til jobbets run-metode. Arbejdsbænkens statusoversigt viser alle statusmeddelelser og enheder af udført arbejde, der gives til denne overvågning.
Den leverede statusovervågning bruges også til at kontrollere for annullering af anmodninger, der er foretaget fra statusoversigten. Når en bruger (eller en plugin vha. job-API) forsøger at annullere et job, returnerer IProgressMonitor-metoden isCanceled() true. Det er jobbets ansvar at kontrollere annulleringsstatus for et job ofte og at reagere på en annullering ved at afslutte metoden run så hurtigt som muligt, så snart det registrerer en annullering. Følgende run-metode rapporterer status og reagerer på jobannullering:
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); //... udfører noget arbejde ... monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
Metoden beginTask bruges til at navngive opgaven i den tilsvarende statusoversigt og til at etablere den samlede mængde arbejde, der skal udføres, så oversigten kan beregne status. subTask-meddelelser vises som et underordnet element i statustræstrukturen som udført arbejde. Statusoversigten beregner og viser en procentdel for udført arbejde, og denne er baseret på den mængde arbejde, der er rapporteret i kaldene worked.
Som du kan se, er IProgressMonitor-klassen udviklet med tanke for tilsvarende grænsefladeunderstøttelse. Platformens
grænseflade-plugin stiller understøttelse til rådighed, så arbejdsbænken kan vise status for job, der udføres. Du kan definere dine job med tanke for det, så du kan styre, hvordan de præsenteres.
I Understøttelse af arbejdsbænkssamtidighed
finder du detaljerede oplysninger om, hvilke API'er der er tilgængelige for visning af jobstatus.
Hvad hvis jobbet er en implementeringsdetalje på lavt niveau, som du ikke ønsker at vise til brugere? Du kan markere jobbet som et systemjob. Et systemjob ligner alle andre job, bortset fra at den tilhørende grænsefladeunderstøttelse ikke opstiller en statusoversigt eller viser noget som helst andet på grænsefladen, der er knyttet til at udføre et job. Hvis dit job ikke direkte initieres af en bruger, eller hvis jobbet er en periodisk opgave, der kan konfigureres af en bruger, bør det være et systemjob. Protokollen for definition af et systemjob er enkel:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
Kaldet setSystem skal udføres, inden jobbet planlægges. Der udløses en undtagelse, hvis du forsøger at udføre dette kald for et job, der aktuelt venter, er i dvale eller udføres.
Hvis jobbet er lang tid om at blive udført og er startet af en bruger, bør du markere jobbet som et brugerjob. Et brugerjob vises i en dialogboks for modalstatus, der indeholder en knap, som kan bruges til at flytte dialogboksen til baggrunden. Arbejdsbænken definerer en brugerindstilling, der styrer, om disse dialogbokse nogensinde er modal. Ved at definere dit job som et brugerjob vil feedback om status automatisk være i overensstemmelse med brugerindstillingen for statusvisning. Protokollen for definition af et brugerjob ligner følgende:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
Kaldet setUser skal også foretages, inden jobbet er planlagt.
Statusgrupper er en anden mekanisme, der kan bruges til at påvirke den måde, hvorpå et job vises på grænsefladen. Når det er mere relevant at vise en samlet status over flere relaterede job på grænsefladen, kan en særlig IProgressMonitor, der repræsenterer en gruppe relaterede job, oprettes. Denne overvågningsfunktion oprettes vha. IJobManager-protokollen. Følgende stykke kode viser, hvordan du opretter en statusgruppe og knytter den til et job.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // angiver de arbejdsenheder, som jobbet skal vise. job.schedule() ...
Ved hjælp af gruppefaciliteten kan plugins bryde opgaver op i flere job, hvis der er behov for det, men de skal rapporteres til brugeren som en enkelt opgave. Overvågningsfunktionen for statusgrupper håndterer detaljerne til brug for beregning af færdiggørelsesprocenten i forhold til alle job i gruppen.
Et job skal placeres i statusgruppen, inden det planlægges. Når udførelsen af et job afsluttes, går jobbets reference til statusgruppen tabt. Hvis jobbet skal planlægges igen, skal det først defineres i gruppen igen.