Episódio 7 - Controle total: cancelamento e limpeza de tarefas assíncronas no Delphi
Quem nunca clicou em um botão de "Cancelar" e o programa ignorou solenemente o comando?
Pois é. O cancelamento de uma thread no Delphi sempre foi uma dor de cabeça, especialmente quando usamos TTask.Runou TThread cru. O problema não é apenas parar a execução: é parar com graça, limpando os recursos usados e garantindo que a UI volte ao normal.
Neste episódio, vamos mostrar como a TSafeThreadInterface e o TTaskChain lidam com cancelamento de forma segura, responsiva e previsível.
O desafio do cancelamento
Imagine que você esteja atualizando milhares de registros. O usuário se arrepende e clica em "Cancelar". O que você espera?
- Que a tarefa realmente pare
- Que os componentes visuais sejam reativados
- Que os recursos sejam liberados
- Que nenhuma exceção apareça do nada
Agora tente fazer isso com TThread cru.
🧩 Boa sorte.
Como a TSafeThreadInterface resolve isso
A classe já vem com suporte embutido a cancelamento:
Params.RequestCancel;permite solicitar o cancelamento- Dentro da lógica de execução, você verifica
Params.CancelRequested - Se estiver
True, basta sair do processamento - O callback
OnCancelserá chamado automaticamente na UI Thread, permitindo restaurar a interface com segurança
Exemplo:
if Params.CancelRequested then
Exit;
E o TTaskChain?
Cada tarefa encadeada também respeita o cancelamento:
- Você pode usar
Params.RequestCanceldentro de qualquer tarefa - Se isso acontecer, o
TTaskChaininterrompe a execução da cadeia - O progresso e os callbacks finais são chamados mesmo em caso de cancelamento
Além disso, o ciclo de vida se encerra automaticamente sem memory leak nem exceções silenciosas.
Dicas práticas:
- Sempre verifique
CancelRequesteddentro de laços longos - Libere recursos no
OnTerminateouOnCancel - Evite
ShowMessageem callbacks de cancelamento (são bloqueantes) - Prefira
Memo.Lines.Addou componentes visuais não intrusivos
Resultado final:
- Cancelamento imediato
- Sem travamentos
- Interface restaurada
- Usuário feliz
E o melhor:
Sem Sleep(10) no meio do código como solução mágica.No próximo episódio, vamos ver como tudo isso se encaixa num modelo declarativo configurado via JSON.
Threads podem ser seguras. E canceláveis.
Basta projetá-las com respeito ao que mais importa: o ciclo de vida completo.