A hosszan futó feladatoknak (amelyek egy másodpercnél tovább tartanak) jelentést kell adniuk az előrehaladásról az IProgressMonitor számára, amely átkerül a feladat run metódusához. A munkaterület előrehaladás nézet megjeleníti az összes előrehaladás üzenetet és a befejezett munka egységeit a megfigyelő számára.
A biztosított előrehaladás-figyelőt az előrehaladás nézetből küldött törlési kérések ellenőrzéséhez is használni kell. Ha a felhasználó (vagy a bedolgozó egy feladat API segítségével) megpróbál törölni egy feladatot, akkor az IProgressMonitor isCanceled() metódusa igaz értéket ad vissza. A feladat felelőssége, hogy gyakran ellenőrizze a feladat törlés állapotát és válaszoljon a törlésre azáltal, hogy amilyen hamar csak lehet, kilép a run metódusból, amikor észleli a törlést. Az alábbi run metódus jelentést készít az előrehaladásról és válaszol a feladattörlésre:
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); //... végrehajt valami feladatot ... monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
A beginTask metódus megnevezi a feladatot a megfelelő előrehaladás nézetben, és kialakítja a teljes végrehajtandó munkát, így a nézet fel tudja dolgozni az előrhaladást. A subTask üzenetek leszármazottként jelennek meg az előrehaladás fában, ha a munka befejeződött. Az előrehaladás nézet kiszámítja és megjeleníti a végrehajtott százalékot a worked hívásokban jelentett munka mennyisége alapján.
Ahogy láthatja, az IProgressMonitor
osztályt a megfelelő UI támogatás figyelembe vételével alakították ki. A
platform UI bedolgozója támogatást biztosít, így a munkaterület meg tudja
jeleníteni a futó feladatok előrehaladását. A feladatok ennek figyelembe
vételével állíthatja be, így szabályozhatja a megjelenítésüket.
A feladatok előrehaladásának megjelenítéséhez rendelkezésre álló
alkalmazás programozási felületek részletesebb leírását a
Munkaterület konkurencia támogatás
tartalmazza.
Mi történik, ha a feladat egy alacsony szintű megvalósítási részlet, amelyet nem kíván megjeleníteni a felhasználó számára? Beállíthatja a feladatok rendszerfeladatként. A rendszerfeladat olyan, mint a többi feladat, azzal a kiétellel, hogy a megfelelő UI támogatás nem állít be előrehaladás nézetet, és nem jelenít meg futó feladathoz rendelt más UI affordances. Ha a feladatot nem közvetlenül a felhasználó kezdeményezte, vagy nem egy periodikus feladat, amelyet a felhasználó beállíthat, akkor a feladatnak rendszerfeladatnak kell lennie. A rendszerfeladat beállításának protokollja egyszerű:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
A setSystem hívást a feladat ütemezés előtt kell kiadni. Egy kivétel történik, ha ezt a hívást egy olyan feladaton próbálja meg, amely jelenleg várakozik, alszik vagy fut.
Ha a feladat egy hosszan futó művelet, amelyet a felhasználó kezdeményezett, akkor a feladatnak felhasználói feladatnak kell lennie. A felhasználói feladat egy modális előrehaladás párbeszédablakban jelenik meg, amely egy gombot biztosít a párbeszédablak háttérbe mozgatásához. A munkaterület meghatároz egy felhasználói beállítást, amely szabályozza, hogy ezek a párbeszédablakok modálisak-e. Ha a feladatot felhasználói feladatként adja meg, akkor az előrehaladás visszajelzés automatikusan meg fog felelni az előrehaladás megjelenítés felhasználói beállításának. A felhasználói feladat beállításának protokollja hasonló:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
A setUser hívást szintén a feladat ütemezése előtt kell kiadni.
Az Előrehaladás csoportok egy másik mechanizmus, melynek segítségével befolyásolható a feladatok megjelenése az UI-n. Ha megfelelőbb a számos kapcsolódó feladat összesített előrehaladásának megjelenítése az UI-n, akkor létrehozható egy speciális IProgressMonitor elem, amely megjeleníti a létrehozható kapcsolódó feladatok csoportját. Ez a figyelő az IJobManager protokoll segítségével kerül létrehozásra. Az alábbi részlet megjeleníti, hogy hogyan hozható létre egy előrehaladás csoport, és hogyan rendelhető hozzá egy feladathoz.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // megadja a munkaegységet, amelyet a feladatnak meg kell jelenítenie. job.schedule() ...
A csoport szolgáltatás segítségével a bedolgozók a feladatokat szükség esetén több feladatra szedhetik szét, de a jelentést a felhasználó számára úgy kell készíteni, mintha egy feladatot alkotnának. Az előrehaladáscsoport-figyelő kezeli a csoport összes feladatához viszonyított százalékos befejezés feldolgozásának részleteit.
A feladatot ütemezés előtt az előrehaladás-csoportba kell helyezni. A feladat futásának befejezése után az előrehaladás-csoportra mutató hivatkozás elveszik. Ha a feladatot újból ütemezni kell, akkor ütemezés előtt újból be kell állítani a csoportba.