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 sucessoOnTaskError: chamada se houve erro (opcional)
O 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
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."