TheCodeNaked

Paralelismo - Episódio 11 (Copy)

Episódio 11 — Integrando Threads com Banco de Dados sem Travar a UI

Uma das situações mais comuns em aplicações Delphi é o uso intensivo de bancos de dados: leitura, inserção, atualização, sincronização com APIs REST... E quem já tentou fazer isso com TThread sabe: o caminho é cheio de armadilhas.

🔴 O que costuma dar errado

  • FDMemTable trava a interface ao fazer .Post em massa
  • FetchAllApplyUpdatesMergeChangeLog são bloqueantes
  • Atualizações concorrentes causam race conditions ou deadlocks
  • O uso de TTask.Run sem ciclo de vida claro leva a Access Violations misteriosas

O que propomos aqui:

Com TSafeThread, você pode:

  • Executar operações em lote com segurança
  • Atualizar a UI com barra de progresso real
  • Cancelar a execução em tempo real
  • Mostrar mensagens e indicadores sem congelar a interface

E com TTaskChain, você pode:

  • Fazer etapas encadeadas como:
    1. Criar campos
    2. Inserir registros (em lote ou individualmente)
    3. Atualizar registros com progresso visível

Exemplo prático

Imagine um caso comum:

  • Criar dinamicamente uma FDMemTable
  • Preencher 100.000 registros com dados simulados
  • Atualizar campos com novos dados
Params := TSafeThreadParams.New
  .SetOnInitialize(...)
  .SetOnExecute(
    procedure(Context: TThreadContext)
    begin
      for I := 1 to 100000 do
      begin
        if Params.CancelRequested then Exit;
        // Inserção segura
      end;
    end)
  .SetOnSuccess(...)
  .SetOnError(...)
  .SetOnTerminate(...);

TSafeThread.ExecuteThread(Params);

Com TTaskChain, você poderia fazer isso em três etapas encadeadas:

Chain := TTaskChain.Create(True);
Chain.AddTask('Create Fields', ...);
Chain.AddTask('Insert Records', ...);
Chain.AddTask('Update Records', ...);
Chain.Start;

🔎 Observações importantes

  • Nunca use ShowMessage dentro de uma thread (mesmo com Synchronize) em operações em massa
  • Sempre proteja acesso a TFDMemTable com DisableControls / EnableControls
  • Utilize BeginBatch / EndBatch para operações em lote
  • Use TCriticalSection se houver múltiplas threads acessando recursos comuns

🚀 Conclusão

Com TSafeThread e TTaskChain, você traz controle e profissionalismo para um dos pontos mais sensíveis do Delphi: o acesso a dados em segundo plano.

Nos próximos episódios, vamos ver como aplicar isso em tarefas recorrentes, agendadas e sensíveis ao tempo.

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