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) {
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.
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;
}
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 de Coincidência 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 {
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.
public TrivialJob() {
super("Trivial Job");
setSystem(true);
}
...
}
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 {
A chamada setUser também deve ser feita antes que a tarefa seja
planejada.
public TrivialJob() {
super("Trivial Job");
setUser(true);
}
...
}
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 snippet mostra como criar um grupo de progresso e associá-lo a uma tarefa.
...
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.
IJobManager jobMan = Platform.getJobManager();
myGroup = jobMan.createProgressGroup();
job.setProgressGroup(myGroup, 600); // specify the units of work the job needs to show.
job.schedule()
...
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.