Episódio 37 - Encerrando com Confiança: Lidando com o Término da Cadeia
Conforme nos aproximamos do fim dessa jornada de paralelismo elegante no Delphi, precisamos garantir que o encerramento das operações também seja tratado com a mesma robustez com que lidamos com a execução.
Até aqui, vimos como:
- Executar tarefas em paralelo sem travar a interface
- Tratar erros de forma segura e visível
- Cancelar execuções em tempo real
- Encadear tarefas com o
TTaskChain - Interpretar estruturas condicionais vindas de JSON
- Reaproveitar a arquitetura para criar mini interpretadores lógicos
Agora, precisamos falar do final da cadeia.
O desafio de encerrar corretamente
Toda tarefa precisa de um encerramento limpo:
- Liberar recursos alocados
- Atualizar a UI indicando fim do processo
- Registrar logs ou mostrar relatórios
- Informar ao usuário que tudo correu bem (ou não)
Isso pode parecer trivial, mas é justamente no final que muitos erros aparecem:
- UI que continua com spinner rodando
- Recursos de memória que não são liberados
- Tarefas que terminam com erro silencioso
A solução integrada
Tanto TSafeThreadInterface quanto TTaskChain prevêm ganchos específicos para encerramento:
OnComplete: chamado mesmo após erro, se você permitir viaCompleteWithErrorOnTerminate: sempre invocado no fim da execução, ideal para liberar recursosSetProgressCallbackdoTTaskChain: permite mostrar status final para cada etapa
Com essas três ferramentas, você pode garantir:
- Feedback claro para o usuário
- Encerramento organizado e livre de vazamentos
- Logs completos sobre sucesso, erro ou cancelamento
Exemplo prático de encerramento
Params := TSafeThreadParams.New
.SetOnComplete(
procedure(Context: TThreadContext)
begin
// Finalização segura
MemoLog.Lines.Add('Processo encerrado.');
Spinner.Visible := False;
end)
.SetOnTerminate(
procedure(Context: TThreadContext)
begin
// Libera recursos
FreeAndNil(FTempBitmap);
end);
E no TTaskChain:
TaskChain.SetProgressCallback(
procedure(TaskName: string; Current, Total: Integer; EndTask, EndWithError: Boolean)
begin
if EndTask then
MemoStatus.Lines.Add(Format('%s finalizada. Sucesso: %s', [TaskName, BoolToStr(not EndWithError, True)]));
end);
Conclusão
Encerrar corretamente é tão importante quanto executar corretamente. Evita efeitos colaterais, melhora a experiência do usuário e garante manutenção limpa do sistema.
No próximo (e possivelmente último) episódio, vamos revisar toda a jornada e propor um caminho para o futuro.
"A forma como você termina uma tarefa diz tanto sobre sua qualidade quanto a forma como você a inicia."
Vamos para a conclusão?