Vykazování průběhu

Dlouho probíhající úlohy (trvající déle než sekundu) by měly nahlašovat svůj postupný průběh monitoru IProgressMonitor, který se předá metodě run dané úlohy. Pohled pracovní plochy se zobrazením průběhu bude zobrazovat všechny zprávy o průběhu a jednotky dokončené práce, jak jsou předávány tomuto monitoru.

Poskytnutý monitor průběhu by se také měl používat ke kontrole přítomnosti požadavků na zrušení provedených z pohledu se zobrazením průběhu. Když se uživatel (nebo modul plug-in používající rozhraní API dané úlohy) pokusí úlohu zrušit, potom metoda isCanceled() monitoru průběhu IProgressMonitor vrátí hodnotu true. Úloha musí často kontrolovat stav svého zrušení a reagovat na zrušení opuštěním metody run co nejdříve po zjištění požadavku na zrušení. Následující metoda run vykazuje postup a reaguje na zrušení úlohy:

            public IStatus run(IProgressMonitor monitor) {
final int ticks = 6000;      monitor.beginTask("Provedení určitého úkonu", ticks);
  try {
for (int i = 0; i < ticks; i++) {if (monitor.isCanceled())return Status.CANCEL_STATUS;            monitor.subTask("Zpracování značek #" + i);
//... provést určitou práci ...monitor.worked(1);         }
   } finally {
monitor.done();      }
return Status.OK_STATUS;
}

Metoda beginTask slouží k pojmenování úlohy v odpovídajícím pohledu se zobrazením průběhu a také ke stanovení celkového objemu práce potřebné k tomu, aby pohled mohl vypočítat průběh. Během práce se budou zprávy subTask zobrazovat jako podřízený prvek ve stromu průběhu. Pohled se zobrazením průběhu vypočítá a zobrazí, kolik procent práce je již provedeno, a to na základě množství vykazovaných ve voláních worked (zpracováno).

Monitory průběhu a uživatelské rozhraní

Jak vidíte, třída IProgressMonitor je navržena tak, aby zohledňovala podporu odpovídajícího uživatelského rozhraní. Modul plug-in uživatelského rozhraní platformy poskytuje podporu, která umožňuje, aby pracovní plocha mohla zobrazovat postup úloh, které právě probíhají. Své úlohy můžete nastavit s ohledem na tuto funkci, abyste mohli řídit, jak jsou prezentovány.

Podrobnosti o dostupných rozhraních API pro zobrazování postupu průběhu úloh najdete v částiPodpora souběžnosti pracovní plochy.

Systémové úlohy

Co když je některá úloha jen podrobností implementace s nízkou úrovní důležitosti, kterou nechcete uživatelům ukazovat? Takovou úlohu můžete označit příznakem systémové úlohy. Systémová úloha je stejná jako kterákoli jiná úloha, pouze příslušná podpora uživatelského rozhraní nesestaví pohled se zobrazením průběhu ani žádné jiné vymoženosti uživatelského rozhraní související s prováděním úlohy. Pokud se nejedná o úlohu přímo spouštěnou uživatelem ani o periodickou úlohu, kterou může uživatel konfigurovat, měla by taková úloha být označena jako systémová úloha. Protokol pro nastavení systémové úlohy je jednoduchý:

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Triviální úloha");
         setSystem(true);
      }
      ...
   }

Před naplánováním úlohy je nutno provést volání setSystem. Pokud se pokusíte o toto volání u úlohy, která momentálně čeká, je nečinná nebo již probíhá, dojde ke spuštění výjimky.

Uživatelské úlohy

Pokud je některá úloha dlouhá a je spouštěná uživatelem, měli byste ji označit příznakem uživatelské úlohy. Uživatelská úloha se bude zobrazovat v modálním dialogovém okně se zobrazováním průběhu, které nabízí tlačítko pro přesunutí dialogového okna na pozadí. Pracovní plocha definuje uživatelskou předvolbu, která určuje, zda se tato dialogová okna někdy stanou modálními. Pokud úlohu definujete jako uživatelskou, bude se vaše zpětná vazba o postupu průběhu automaticky podřizovat uživatelské předvolbě pro zobrazování postupu průběhu. Protokol pro nastavení uživatelské úlohy je podobný:

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Triviální úloha");
         setUser(true);
      }
      ...
   }

Před naplánováním úlohy je nutno provést volání setUser.

Průběhové skupiny

Průběhové skupiny jsou dalším mechanizmem, jehož prostřednictvím je možno ovlivnit způsob, jakým se úloha zobrazuje v uživatelském rozhraní. Pokud je vhodnější zobrazovat v uživatelském rozhraní souhrnný postup několika souvisejících úloh, lze vytvořit zvláštní monitor průběhu IProgressMonitor, který představuje celou skupinu vzájemně souvisejících úloh. Tento monitor se vytváří za použití protokolu IJobManager. Následující úsek kódu ukazuje, jak vytvořit průběhovou skupinu a přiřadit ji k určité úloze.

   ...
   IJobManager jobMan = Platform.getJobManager();
myGroup = jobMan.createProgressGroup();job.setProgressGroup(myGroup, 600);  // určete jednotky práce, které má úloha zobrazovat.job.schedule()   ...

Tento skupinový prostředek umožňuje modulům plug-in rozčlenit jednotlivé úlohy v případě potřeby na několik úloh, avšak vykazovat je uživateli, jako by to byla jediná úloha. Monitor průběhu skupiny ošetří podrobnosti potřebné pro výpočet procentního podílu hotové práce ve vztahu ke všem úlohám ve skupině.

Úlohu je nutno umístit do průběhové skupiny ještě před jejím naplánováním. Po skončení běhu úlohy se její odkazy na průběhovou skupinu ztratí. Pokud se má úloha znovu naplánovat, je nutno ji do skupiny vložit znovu ještě před takovým dalším naplánováním.