TerraLib Common Runtime → Progress

As classes referentes a definição do conceito de Progresso e Controle de Progresso estão definidos dentro do módulo common da terralib.

Foi criado uma classe chamada TaskProgress que tem por objetivo representar o progresso de um processo. Todos essas tarefas ficam registradas em um singleton denominado ProgressManager. É possivel criar n tareas em sequencia ou mesmo em paralelo. Essas tarefas estarem ativas não implicam que elas sejam visualizadas em uma aplicação. Para isso é necessário que um visualizador de tarefas esteja tambem definido nesse singleton de tarefas. Esses visualizadores são defindos como AbstractProgressViewer e podem existir mais de um tipo de visualizador ao mesmo tempo. Uma classe “utilitaria”, ProgressTimer, foi criada para informar uma estimativa de término de cada tarefa.

Os visualizadores devem definir suas estratégias para visualizar uma ou mais tarefas, ou seja, pode existir uma barra de tarefa unica que seja capaz de representar todos os trabalhos ativos ou n barras de tarefa, uma para cada tarefa. Tambem devem se preocupar com situações onde trabalhos estao sendo processados de forma paralela.

Projeto

Visão geral das classes ligadas ao feedback do progresso de tarefas:

Overview of Progress Classes

ProgressManager: Singleton responsavel por “registrar” todas as tarefas e visualizadores.

TaskProgress: Representa a evolução de uma tarefa.

ProgressTimer: Informa a tarefa sobre o tempo restante e qual a velocidade do processamento.

AbstractProgressViewer: Classe abstrata para representar um visualizador de uma tarefa.

ConsoleProgressViewer: Representa uma barra de progresso no console.

 Diagrama de Classes

Veja também os componentes Qt para visualização de progresso.

Exemplos Práticos

A utilização das classes de progresso é muito simples, não é necessário se preocupar com a registro e remoção das tarefas do singleton, uma vez que isso ocorre automaticamente no construtor e destrutor da classe TaskProgress. As informações referentes a tarefa como número de passos, descrição ou mesmo se esse trabalho esta sendo executado em thread são atributos deste objeto e podem ser facilmente “setados”.

A seguir tem um exemplo de sua utilização.

te::common::TaskProgress task;
task.setTotalSteps(TOTAL_STEPS);
task.setMessage("Pogress Test");
 
for(unsigned int i = 0; i < TOTAL_STEPS; ++i)
{
  if(!task.isActive())
  {
    break;
  }
 
  ...
 
  task.pulse();
}

Considerações Finais

Ficou interessante esta abordagem por tornar independente o conceito de progresso de uma tarefa com sua representação visual.

Um outro ponto a se destacar é a possibilidade de se criar n tarefas ao mesmo tempo, ou mesmo, tarefas aninhadas.

Uma pendencia ainda a ser resolvida é a incapacidade de se utilizar a funcionalidade do ProgressTimer em tarefas sendo executadas em ambiente multi thread.

Alguma pendências da classe TaskProgress:

  • ProgressTimer is NOT working if TaskProgress is in multithread mode.
  • code restriction, must be fixed

QR Code
QR Code wiki:designimplementation:common:progress (generated for current page)