TheCodeNaked

Paralelismo - Episódio 37 (Copy)

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 via CompleteWithError
  • OnTerminate: sempre invocado no fim da execução, ideal para liberar recursos
  • SetProgressCallback do TTaskChain: 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?

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