TheCodeNaked

Execução Paralela com elegância no Delphi: uma thread de cada vez (sem travar a UI) - 2 (Copy)

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 finalizadoinclusive 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 indicador
  • SetOnExecute: baixa a imagem com TNetHttpClient
  • SetOnSuccess: mostra a nova imagem
  • SetOnComplete: esconde o indicador
  • SetOnError: mostra um aviso em caso de falha
  • SetOnTerminate: 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.

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