Les tâches longues (durant plusieurs secondes) doivent indiquer la progression au protocole IProgressMonitor transmis à la méthode run de la tâche. La vue de la progression du plan de travail affiche tous les messages de progression et les unités de travail terminé sur ce moniteur.
Le moniteur de progression indiqué doit toujours être utilisé pour rechercher des demandes d'annulation effectuées dans la vue de la progression. Lorsqu'un utilisateur (ou un plug-in utilisant l'API de tâche) tente d'annuler une tâche, la méthode isCanceled() de IProgressMonitor renvoie la valeur true. Il revient à la tâche de vérifier fréquemment le statut d'annulation d'une tâche et de répondre à une annulation en quittant la méthode run dès que possible lorsqu'il détecte une annulation. La méthode run ci-dessous indique la progression et répond à l'annulation de la tâche :
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); //... pour effectuer un travail ... monitor.worked(1); } } finally { monitor.done(); } return Status.OK_STATUS;
}
La méthode beginTask est utilisée pour nommer la tâche dans la vue de progression correspondante et pour définir la quantité totale de travail à effectuer afin que la vue puisse calculer la progression. Les messages subTask s'affichent comme enfants dans l'arborescence de progression lorsque le travail est terminé. La vue de progression calcule et affiche un pourcentage de réalisation en fonction de la quantité de travail indiquée dans les appels worked.
Comme vous pouvez le constater, la classe IProgressMonitor
est conçue avec la prise en charge de l'interface utilisateur correspondante en tête. Le plug-in de l'interface utilisateur de la plate-forme permet la prise en charge afin que le plan de travail puisse afficher la progression pour les tâches en cours d'exécution. Vous pouvez configurer les tâches avec cet état de fait en tête, afin de pouvoir contrôler la manière dont elles sont présentées.
Pour plus d'informations sur les API disponibles pour afficher la progression des tâches, reportez-vous à la section Prise en charge de l'accès concurrent au plan de travail.
Que se passe-t-il si une implémentation de niveau inférieur indique que vous ne souhaitez pas afficher des éléments à l'attention des utilisateurs ? Vous pouvez marquer la tâche comme tâche système. Une tâche système est comme une autre tâche à l'exception du fait que la prise en charge de l'interface utilisateur correspondante ne configure pas une vue de progression ou n'affiche pas d'autre fonctions de l'interface utilisateur associées à l'exécution d'une tâche. Si la tâche n'est pas lancée directement par un utilisateur ou si une tâche périodique ne peut pas être configurée par un utilisateur, la tâche doit devenir une tâche système. Le protocole pour définir une tâche système est simple :
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
L'appel de setSystem doit être effectué avant que la tâche soit planifiée. Une exception est déclenchée si vous tentez d'effectuer cet appel sur une tâche qui est en cours d'attente, en pause ou en cours d'exécution.
Si la tâche est une tâche longue lancée par un utilisateur, vous devez marquer cette tâche comme tâche utilisateur. Une tâche utilisateur s'affiche dans une boîte de dialogue de progression modale qui met à disposition un bouton permettant de déplacer la boîte de dialogue à l'arrière-plan. Le plan de travail définit une préférence utilisateur qui contrôle si ces boîtes de dialogue sont modales. En définissant la tâche comme tâche utilisateur, les commentaires sur la progression se conforment automatiquement à la préférence utilisateur pour l'affichage de la progression. Le protocole permettant de définir une tâche utilisateur est similaire :
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
L'appel de setUser doit également être effectué avant que la tâche soit planifiée.
Les groupes de progression constituent un autre mécanisme qui peut être utilisé pour influencer la manière dont une tâche s'affiche dans l'interface utilisateur. Lorsqu'il est plus approprié d'afficher la progression cumulée de plusieurs tâches liées dans l'interface utilisateur, il est possible de créer un protocole IProgressMonitor spécial qui représente un groupe de tâches liées. Ce moniteur est créé à l'aide du protocole IJobManager. Le fragment de code ci-dessous indique comment créer une groupe de progression et l'associer à une tâche.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup(); job.setProgressGroup(myGroup, 600); // pour indiquer les unités de travail que la tâche doit afficher. job.schedule() ...
La fonction de groupe permet aux plug-ins de diviser la tâche en tâches multiples si nécessaire et de les présenter à l'utilisateur comme s'il s'agissait d'une tâche unique. Le moniteur de groupe de progression gère les détails de calcul du pourcentage de réalisation par rapport à toutes les tâches du groupe.
Une tâche doit être placée dans le groupe de progression avant d'être planifiée. Une fois que l'exécution d'une tâche est terminée, sa référence au groupe de progression est perdue. Si la tâche doit être de nouveau planifiée, elle doit être redéfinie dans le groupe avant d'être planifiée.