Episódio 2 – Anatomia de um ciclo de vida seguro: da inicialização ao término
No primeiro artigo, vimos como TSafeThread e TTaskChain resolvem, com elegância, o problema das threads que travam a UI, desaparecem silenciosamente ou se tornam impossíveis de depurar. Agora é hora de entender o que acontece por baixo dos panos.
⏰ O ciclo de vida completo da execução
Toda execução com TSafeThread segue uma orquestra bem definida de etapas. E você, como maestro, define o que acontece em cada uma:
Params := TSafeThreadParams.New
.SetOnInitialize(...)
.SetOnExecute(...)
.SetOnSuccess(...)
.SetOnComplete(...)
.SetOnTerminate(...)
.SetOnError(...);
Vamos entender cada uma delas:
SetOnInitialize
Executa antes da tarefa principal, na thread principal (UI). Ideal para:
- Mostrar um
TAniIndicator - Preparar a UI
- Limpar memos ou grids
SetOnExecute
Executa a tarefa pesada, em background. Aqui está o que você quer delegar para outra thread:
- Download de arquivos
- Cálculos intensivos
- Processamento de banco de dados
Importante: não toque em nada da UI aqui.
SetOnSuccess
Executa na thread principal, mas somente se não houve erro nem cancelamento. Ideal para:
- Atualizar a UI com resultado
- Mostrar dados recebidos
- Mostrar mensagem de sucesso
SetOnComplete
Executa sempre que o OnExecute for finalizado, inclusive se houve erro (dependendo do CompleteWithError := True). Ideal para:
- Esconder indicadores
- Finalizar recursos visuais
SetOnError
Executa na UI, se uma exceção for lançada no OnExecute. Aqui você trata o problema com elegância:
- Mostrar mensagem de erro
- Escrever log
- Sugerir nova tentativa
SetOnCancel
Executa se você chamar RequestCancel. Ideal para:
- Restaurar estado da tela
- Mostrar que a ação foi cancelada pelo usuário
SetOnTerminate
Executa por último, sempre. A ideia é garantir:
- Liberação de recursos
- Reset da UI
- Qualquer outro fim de ciclo
Um exemplo bem visual
Imagine um download de imagem:
SetOnInitialize: limpa a imagem anterior, mostra indicadorSetOnExecute: baixa a imagem comTNetHttpClientSetOnSuccess: mostra a nova imagemSetOnComplete: esconde o indicadorSetOnError: mostra um aviso em caso de falhaSetOnTerminate: libera bitmap e reativa os botões
E a segurança?
Todos os callbacks são automaticamente sincronizados com a UI quando necessário. Você não precisa de TThread.Synchronize ou Queue. Isso é feito por você. E se você usar dentro de TTaskChain, pode ter certeza que a continuidade está garantida.
Próximo Episódio:
Vamos explorar como capturar erros sem panicar e como usar o SetOnError de forma eficiente.
"A thread pode acabar, mas o controle é seu até o final."
Nos vemos no Episódio 3.