Tidkrevende jobber (det vil si jobber som varer i mer enn ett sekund) skal rapportere fremdriften til IProgressMonitor, som sendes til jobbens run-metode. Fremdriftsvisningen i arbeidsbenken viser alle fremdriftsmeldinger og enheter med fullført arbeid som er oppgitt i denne overvåkeren.
Fremdriftovervåkeren skal også brukes for å kontrollere om det er avbruddsforespørsler fra fremdriftsvisningen. Når en bruker (eller plugin-modul som bruker jobbprogrammeringsgrensesnitt) forsøker å avbryte en jobb, returnerer IProgressMonitor-metoden isCanceled() true. Jobben skal foreta hyppig kontroll av avbruddsstatusen for en jobb, og dersom den oppdager avbrudd skal den raskest mulig svare på avbruddet ved å avslutte run-metoden. Følgende run-metode rapporterer fremdrift og svarer på jobbavbrudd:
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 brukes til å navngi oppgaven i den tilhørende fremdriftsvisningen, og til å opprette samlet arbeidsmengde som skal utføres slik at visningen kan beregne fremdriften. subTask-meldingene vises som underordnede i fremdriftstreet etter hvert som det utføres arbeid. Fremdriftsvisningen beregner og viser en prosentvis fullføringsgrad basert på den rapporterte arbeidsmengden i worked-kall.
Som du ser er IProgressMonitor-klassen
utformet med tilhørende brukergrensesnittstøtte i tankene. Plattformens plugin-modul for
brukergrensesnitt støtter arbeidsbenken slik at den kan vise fremdrift for jobber som
kjøres. Du kan definere jobbene med dette i tankene og selv bestemme
hvordan de skal presenteres.
Du kan se nærmere på tilgjengelige programmeringsgrensesnitt for visning av fremdrift
for jobber, i Støtte for
samtidighet i arbeidsbenken.
Hva om jobben er en implementeringsdetalj på lavt nivå som du ikke ønsker å vise brukerne? Du kan flagge jobben som en systemjobb. En systemjobb er som enhver annen jobb, bortsett fra at den tilhørende brukergrensesnittstøtten ikke definerer en fremdriftsvisning eller viser annen brukergrensesnittinformasjon i tilknytning til kjøring av en jobb. Hvis jobben verken er direkte startet av brukeren eller en periodisk oppgave som kan konfigureres av brukeren, må jobben være en systemjobb. Protokollen for å definere en systemjobb er enkel:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
Kallet setSystem må utføres før jobben planlegges. Det kan utløses et unntak hvis du forsøker å bruke dette kallet på en jobb som venter, sover eller kjører.
Hvis jobben er en tidkrevende operasjon som startes av en bruker, skal jobben flagges som en brukerjobb. En brukerjobb vises i en modal fremdriftsdialogboks og har en knapp som lar deg flytte dialogboksen til bakgrunnen. Arbeidsbenken definerer en brukerpreferanse som kontrollerer om disse dialogboksene er modale. Ved å definere jobben som en brukerjobb, vil tilbakemeldinger om fremdriften automatisk oppfylle brukerens preferanser for fremdriftsvisning. Protokollen for å definere en brukerjobb er tilsvarende:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
Kallet setUser må også utføres før jobben planlegges.
Fremdriftsgrupper er en annen mekanisme som kan brukes til å påvirke måten en jobb vises på i brukergrensesnittet. Når det er mer hensiktsmessig å vise den genererte fremdriften for flere beslektede jobber i brukergrensesnittet, kan det opprettes en spesiell IProgressMonitor som representerer en gruppe med beslektede jobber. Denne overvåkeren opprettes ved hjelp av protokollen IJobManager. Følgende snutt viser hvordan du oppretter en fremdriftsgruppe og knytter den til en jobb.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show. job.schedule() ...
Gruppefunksjonen gjør det mulig for plugin-moduler å dele oppgaver inn i flere jobber ved behov, men rapportere dem til brukeren som om de er enkeltoppgaver. Overvåkeren for fremdriftsgruppe håndterer detaljene for beregning av den prosentvise fullføringsgraden i forhold til alle jobbene i gruppen.
En jobb må plasseres i fremdriftsgruppen før den planlegges. Etter at en jobb er ferdig kjørt, går referansen til fremdriftsgruppen tapt. Hvis jobben skal planlegges på nytt, må den defineres i gruppen på nytt før den planlegges.