TheCodeNaked

Execução paralela com elegância no Delphi - Episódio 3: Encadeamento de tarefas com TTaskChain (Copy)

No episódio anterior, mostramos como é possível criar uma thread segura com TSafeThread, controlando sua inicialização, execução, finalização, cancelamento e tratamento de erros. Tudo isso com callbacks bem definidos que mantêm a UI fluida e organizada.

Mas... e se você tiver várias tarefas que dependem umas das outras?

  • Primeiro baixa um JSON
  • Depois processa os dados
  • Em seguida baixa uma imagem
  • E por fim atualiza a UI

Fazer isso com TThread ou mesmo com TSafeThread puro pode virar uma bagunça de chamadas aninhadas. Foi para resolver isso que criamos o TTaskChain.


O que é o TTaskChain?

Um gerenciador de tarefas sequenciais. Cada tarefa é uma etapa independente, que recebe um nome, e dois callbacks:

  • OnTaskSuccess: chamada se a tarefa foi executada com sucesso
  • OnTaskError: chamada se houve erro (opcional)

TTaskChain gerencia:

  • Execução sequencial
  • Cancelamento
  • Continuidade mesmo com erros (se configurado)
  • Callback de progresso geral com informações sobre cada etapa

Como usar

var
  TaskChain: ITaskChain;
begin
  TaskChain := TTaskChain.Create(True); // True = continuar mesmo se der erro

  TaskChain.AddTask('Download JSON',
    procedure(TaskName: string; OnSuccess: TProc; OnError: TErrorCallback)
    begin
      // Chamada do TSafeThread.ExecuteThread
      // Ao final, chamar OnSuccess ou OnError
    end);

  TaskChain.AddTask('Download Image', ...);

  TaskChain.SetProgressCallback(
    procedure(TaskName: string; Current, Total: Integer; Finished, WithError: Boolean)
    begin
      // Atualização de UI global por tarefa
    end);

  TaskChain.Start;
end;

Benefícios

  • Cada tarefa é encapsulada e independente
  • Evita pirâmides de callbacks
  • A UI recebe informações claras: nome da tarefa, posição na fila, se terminou, se houve erro
  • Garante que o ciclo de vida seja gerenciado corretamente
  • Auto-referenciação evita que a cadeia morra no meio da execução

Exemplo de uso real

TaskChain := TTaskChain.Create(True);
TaskChain.AddTask('Baixar JSON',
  procedure(TaskName: string; OnSuccess: TProc; OnError: TErrorCallback)
  begin
    var Params := TSafeThreadParams.New
      .SetOnExecute(procedure(Context: TThreadContext)
      begin
        // Baixa JSON
        OnSuccess();
      end)
      .SetOnError(procedure(const Msg: string)
      begin
        OnError(Msg);
      end);
    TSafeThread.ExecuteThread(Params);
  end);
TaskChain.Start;

Conclusão

TTaskChain é o próximo passo para quem quer lidar com execução paralela de forma organizada. Junto com TSafeThread, ele cria uma base robusta para operações assíncronas de verdade.

No próximo episódio, vamos mostrar como criar seus próprios plugins de tarefa, permitindo reuso entre diferentes fluxos e abstraindo padrões de execução.


"Quem controla o tempo da execução, controla a experiência do usuário."
Sobre o autor

TheCodeNaked

No TheCodeNaked, programar é consequência, não ponto de partida. Antes do código, vem a dúvida, a análise, o contexto. Não seguimos fórmulas — questionamos. Criar software é pensar com clareza. O resto é só digitação.

TheCodeNaked

Criar com clareza. Codificar com intenção.

TheCodeNaked

Ótimo! Você se inscreveu com sucesso.

Bem-vindo de volta! Você acessou com sucesso.

Você se inscreveu com sucesso o TheCodeNaked.

Sucesso! Verifique seu e-mail para acessar com o link mágico.

As suas informações de faturamento foram atualizadas.

Seu pagamento não foi atualizado