Οι χρονοβόρες εργασίες (αυτές που διαρκούν περισσότερο από ένα δευτερόλεπτο) θα πρέπει να αναφέρουν την πρόοδο στην κλάση IProgressMonitor η οποία μεταβιβάζεται στη μέθοδο run της εργασίας. Η προβολή προόδου του πάγκου εργασίας εμφανίζει όλα τα μηνύματα προόδου και τις μονάδες ολοκληρωμένης εργασίας αυτής της παρακολούθησης.
Η παρακολούθηση προόδου που παρέχεται θα πρέπει επίσης να χρησιμοποιείται για τον έλεγχο των αιτήσεων ακύρωσης που υποβάλλονται από την προβολή προόδου. Όταν κάποιος χρήστης (ή μια πρόσθετη λειτουργία με χρήση του API μιας εργασίας) επιχειρεί να ακυρώσει μια εργασία, η μέθοδος της παρακολούθησης IProgressMonitor isCanceled() επιστρέφει true. Ο συχνός έλεγχος της κατάστασης ακύρωσης μιας εργασίας και η απάντηση σε μια ακύρωση μέσω της εξόδου, το συντομότερο δυνατόν με την ανίχνευση της ακύρωσης, από τη μέθοδο run, είναι ευθύνη της εργασίας. Η ακόλουθη μέθοδος run αναφέρει την πρόοδο και απαντά στην ακύρωση της εργασίας:
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;
}
Η μέθοδος beginTask χρησιμοποιείται για να ονομάσει την εργασία στην αντίστοιχη προβολή προόδου και να προσδιορίσει το συνολικό όγκο εργασίας που θα πρέπει να εκτελεστεί έτσι ώστε να καταστεί δυνατός ο υπολογισμός της προόδου από την προβολή. Με την ολοκλήρωση της εργασίας, τα μηνύματα subTask θα εμφανιστούν ως θυγατρικό στοιχείο στη διακλάδωση προόδου. Η προβολή της εργασίας θα υπολογίσει και θα εμφανίσει μια περίπτωση ολοκλήρωσης σε εκατοστιαία βάση ανάλογα με τον όγκο εργασίας που αναφέρετεται στις κλήσεις worked.
Όπως μπορείτε να δείτε, η κλάση IProgressMonitor έχει σχεδιαστεί λαμβάνοντας υπόψη την αντίστοιχη υποστήριξη περιβάλλοντος χρήστη. Η πρόσθετη λειτουργία περιβάλλοντος χρήστη της πλατφόρμας παρέχει υποστήριξη έτσι ώστε ο πάγκος εργασίας να μπορεί να εμφανίζει την πρόοδο για εκτελούμενες εργασίες. Μπορείτε να ρυθμίσετε τις εργασίες σας λαμβάνοντας αυτό το στοιχείο υπόψη σας, έτσι ώστε να μπορείτε να ελέγχετε τον τρόπο παρουσίασης τους.
Δείτε την ενότητα Υποστήριξη ταυτοχρονισμού πάγκου εργασίας για τη λεπτομερή εξοικείωσή σας με τα διαθέσιμα API που χρησιμοποιούνται για την εμφάνιση της προόδου των εργασιών.
Τι συμβαίνει αν η εργασία σας αποτελείται από λεπτομέρειες μιας υλοποίησης χαμηλού επιπέδου οι οποίες δεν επιθυμείτε να είναι ορατές σε άλλους χρήστες; Μπορείτε να επισημάνετε την εργασία σας ως εργασία συστήματος. Μια εργασία συστήματος είναι όπως μια οποιαδήποτε άλλη εργασία, με τη μόνη διαφορά ότι η υποστήριξη περιβάλλοντος χρήστη δεν ορίζει μια προβολή προόδου ή δεν εμφανίζει τυχόν άλλες δυνατότητες του περιβάλλοντος χρήστη που συσχετίζονται με την εκτέλεση μιας εργασίας. Αν στην εργασία σας δεν αποδίδονται αρχικές τιμές απευθείας από το χρήστη, ή δεν είναι μια περιοδική εργασία η οποία μπορεί να ρυθμιστεί από κάποιο χρήστη, τότε η εργασία σας θα πρέπει να είναι μια εργασία συστήματος. Το πρωτόκολλο για τη ρύθμιση ενός συστήματος είναι απλό:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
Η κλήση setSystem πρέπει να γίνεται πριν από τον προγραμματισμό της εργασίας. Εάν επιχειρήσετε αυτή την κλήση σε μια εργασία η οποία βρίσκεται σε κατάσταση αναμονής, αδράνειας ή εκτέλεσης, ενεργοποιείται μια εξαίρεση.
Αν η εργασία σας είναι μια χρονοβόρα λειτουργία στην οποία αποδίδονται αρχικές τιμές από το χρήστη, τότε θα πρέπει να επισημάνετε την εργασία αυτή ως μια εργασία χρήστη. Μια εργασία χρήστη θα εμφανιστεί σε ένα αποκλειστικό πλαίσιο διαλόγου προόδου το οποίο παρέχει ένα κουμπί για τη μετακίνηση του πλαισίου διαλόγου στο παρασκήνιο. Ο πάγκος εργασίας καθορίζει μια προτίμηση χρήστη η οποία ελέγχει εάν αυτά τα πλαίσια διαλόγου μπορεί να είναι αποκλειστικά. Καθορίζοντας την εργασία σας ως εργασία χρήστη, οι πληροφορίες προόδου θα συμμορφώνονται αυτόματα με την προτίμηση χρήστη για την προβολή της προόδου. Το πρωτόκολλο για τη ρύθμιση μιας εργασίας χρήστη είναι το ίδιο:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
Η κλήση setUser πρέπει να γίνεται πριν από τον προγραμματισμό της εργασίας.
Οι Ομάδες προόδου είναι ένας άλλος μηχανισμός που μπορείτε να χρησιμοποιήσετε για να επηρεάσετε τον τρόπο εμφάνισης μιας εργασίας στο περιβάλλον χρήστη. Όταν είναι προτιμότερη η εμφάνιση της συνολικής προόδου διαφόρων σχετικών εργασιών στο περιβάλλον χρήστη, μπορείτε να δημιουργήσετε μια ειδική κλάση IProgressMonitor η οποία αντιπροσωπεύει μια ομάδα σχετικών εργασιών. Αυτή η παρακολούθηση δημιουργείται με χρήση του πρωτοκόλλου IJobManager. Το ακόλουθο τμήμα κώδικα δείχνει τον τρόπο δημιουργίας μια ομάδας προόδου και της συσχέτισής της με κάποια εργασία.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show. job.schedule() ...
Η δυνατότητα ομάδας επιτρέπει στις πρόσθετες λειτουργίες να διαχωρίζουν, εάν χρειάζεται, έργα σε πολλαπλές εργασίες, και να τις αναφέρουν στο χρήστη σαν να επρόκειτο για ένα μεμονωμένο έργο. Η παρακολούθηση προόδου ομάδας θα χειριστεί τις λεπτομέρειες για τον υπολογισμό του ποσοστού της περίπτωσης ολοκλήρωσης που σχετίζεται με όλες τις εργασίες στην ομάδα.
Η τοποθέτηση μιας εργασίας στην ομάδα προόδου πρέπει να γίνεται πριν από τον προγραμματισμό της. Μετά από την ολοκλήρωση εκτέλεσης της εργασίας, η παραπομπή της στην ομάδα προόδου χάνεται. Αν ο προγραμματισμός της εργασίας πρόκειται να επαναληφθεί, πρέπει να ορίζεται πάλι στην ομάδα πριν από την πραγματοποίησή του.