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
- A
FDMemTabletrava a interface ao fazer.Postem massa FetchAll,ApplyUpdates,MergeChangeLogsão bloqueantes- Atualizações concorrentes causam race conditions ou deadlocks
- O uso de
TTask.Runsem 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:
- Criar campos
- Inserir registros (em lote ou individualmente)
- 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
ShowMessagedentro de uma thread (mesmo comSynchronize) em operações em massa - Sempre proteja acesso a
TFDMemTablecomDisableControls/EnableControls - Utilize
BeginBatch/EndBatchpara operações em lote - Use
TCriticalSectionse 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.