Tarefas de longa execução (que duram mais de um segundo) devem relatar o progresso para o IProgressMonitor que é transmitido para o método de execução da tarefa. A visualização de progresso do workbench mostrará todas as mensagens de progresso e as unidades de trabalho concluído fornecidas para este monitor.
O monitor de progresso fornecido também deve ser utilizado para verificar pedidos de cancelamento feitos a partir da visualização de progresso. Quando um usuário (ou plug-in utilizando a API da tarefa) tenta cancelar uma tarefa, o método IProgressMonitor isCanceled() retornarátrue. É a responsabilidade da tarefa freqüentemente verificar o status de cancelamento de uma tarefa e responder a um cancelamento, saindo do método de execução o mais rápido possível assim que ele detecta um cancelamento. O seguinte método de execução relata o progresso e responde ao cancelamento da tarefa:
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;
}
O método beginTask é utilizado para nomear a tarefa na visualização de progresso correspondente e para estabelecer a quantidade total de trabalho a ser feito para que a visualização possa computar progresso. As mensagens subTask aparecerão como um filho na árvores de progresso na medida em que o trabalho é feito. A visualização de progresso calculará e exibirá uma conclusão percentual com base na quantidade de trabalho relatada nas chamadas trabalhadas.
Como você pode ver, a classe do IProgressMonitor
é designada com o suporte da UI correspondente em mente. O plug-in da UI
da plataforma fornece suporte para que o workbench possa mostrar
progresso para as tarefas que estão em execução. Você pode configurar
suas tarefas com isso em mente para que você
possa controlar como elas são apresentadas.
Consulte o Suporte Simultâneo do Workbench
para obter uma visão detalhada das APIs disponíveis para mostrar progresso para as tarefas.
E se a sua tarefa for um detalhe de implementação de nível inferior que você não deseja mostrar aos usuários? Você pode sinalizar sua tarefa como tarefa do sistema. Uma tarefa do sistema é como qualquer outra tarefa, exceto o suporte de UI correspondente que não irá configurar uma visualização de progresso ou mostrar quaisquer outras permissões da UI associadas à execução de uma tarefa. Se a sua tarefa não for diretamente iniciada por um usuário ou uma tarefa periódica que possa ser configurada por um usuário, sua tarefa deve ser uma tarefa do sistema. O protocolo para configurar uma tarefa do sistema é simples:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setSystem(true); } ... }
A chamada setSystem deve ser feita antes que a tarefa seja planejada. Uma exceção será acionada se você tentar essa chamada em uma tarefa que esteja atualmente aguardando, em espera ou em execução.
Se a sua tarefa for uma operação de longa execução que é iniciada por um usuário, você deve sinalizar sua tarefa como uma tarefa do usuário. Uma tarefa do usuário aparecerá em um diálogo de progresso modal que fornece um botão para mover o diálogo para o segundo plano. O workbench define uma preferência do usuário que controla se esses diálogos são modais. Ao definir sua tarefa como uma tarefa do usuário, seu feedback de progresso estará automaticamente em conformidade com a preferência do usuário para visualização do progresso. O protocolo para configurar uma tarefa do usuário é semelhante:
class TrivialJob extends Job { public TrivialJob() { super("Trivial Job"); setUser(true); } ... }
A chamada setUser também deve ser feita antes que a tarefa seja planejada.
Grupos de progresso são outro mecanismo que pode ser utilizado para influenciar o modo que uma tarefa é mostrada na UI. Quando é mais apropriado mostrar o progresso agregado de várias tarefas relacionadas na UI, um IProgressMonitor especial que representa em grupo de tarefas relacionadas pode ser criado. Esse monitor é criado utilizando o protocolo IJobManager. O seguinte fragmento mostra como criar um grupo de progresso e associá-lo a uma tarefa.
... IJobManager jobMan = Platform.getJobManager(); myGroup = jobMan.createProgressGroup();job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show.job.schedule() ...
A facilidade do grupo permite que os plug-ins dividam tarefas em várias tarefas se necessário, mas as relate para o usuário como se fossem uma tarefa única. O monitor do grupo de progresso manipulará os detalhes para computar a conclusão de porcentagem relativa a todas as tarefas no grupo.
Uma tarefa deve ser colocada no grupo de progresso antes de ser planejada. Depois de uma tarefa concluir a execução, sua referência ao grupo de progresso é perdida. Se a tarefa deve ser planejada novamente, deve ser colocada no grupo novamente antes de ser planejada.