Pular para o conteúdo

Como usar Thread no Delphi de forma simples

O estudo de Thread no Delphi é muito importante, se você já viu o seu programa em Delphi mostrar a temida mensagem “Não Respondendo”, provavelmente sentiu aquele frio na barriga — especialmente quando o usuário começa a reclamar que “seu sistema travou”.

Mas aqui vai uma verdade que poucos iniciantes sabem:

💡 Na maioria das vezes, o programa não travou, ele apenas está ocupado demais para atualizar a tela para o usuário.

E é justamente aqui que entram as Threads — um dos recursos mais poderosos (e subutilizados) dentro do Delphi moderno.

Exemplo visual mostrando a diferença entre executar um processo pesado com e sem Thread no Delphi.
Diferença entre usar ou não usar Thread em processamentos pesados!

Neste guia, você vai aprender de forma simples e prática como usar threads sem complicações, com exemplos reais que você poderá testar, incluir no seu projeto e até disponibilizar no GitHub para ajudar outros desenvolvedores.

💭 Por que o Delphi “trava” e aparece o famoso “Não Respondendo”?

Imagine que seu programa é um restaurante.

A thread principal (Main Thread) é o garçom.
Tudo que o usuário vê — botões, telas, mensagens — passa por ela.

Agora pense:

Se esse garçom parar para carregar uma caixa pesada (uma função demorada), ele vai deixar de atender os clientes.
Resultado?

⛔ O Windows acha que o programa travou.
E o usuário também.

É exatamente isso que acontece quando você coloca uma tarefa demorada na thread principal.

O que é uma Thread?

O uso de thread no Delphi é como contratar um ajudante dentro do seu sistema.

Enquanto a thread principal continua atendendo o usuário, a thread secundária faz o trabalho pesado por fora.

👉 Você ganha paralelismo.
👉 A interface não congela.
👉 A experiência do usuário melhora MUITO.

E o melhor: hoje é possível criar uma thread no Delphi com apenas algumas linhas.

Diagrama explicando o funcionamento de uma thread paralela no Delphi
Representação visual de como uma thread executa tarefas pesadas em paralelo no Delphi.

Quando usar Thread no Delphi?

Você deve considerar o uso de threads sempre que executar tarefas como:

✔ Processamento pesado
✔ Consultas lentas ao banco de dados
✔ Leitura de arquivos grandes
✔ Geração de relatórios
✔ Comunicação com API
✔ Loops demorados
✔ Downloads
✔ Compressão de arquivos
✔ Operações que envolvam rede

Qualquer operação que leve mais de 200ms já pode deixar a interface percebivelmente lenta.
Por isso as threads são essenciais em aplicativos profissionais.

Criando sua primeira Thread Anônima no Delphi.

Aqui está a versão mais simples e direta:

TThread.CreateAnonymousThread(
  procedure
  begin
    // Código paralelo
  end
).Start;

Prático, limpo e eficiente.

Esta sintaxe cria uma thread que não trava a interface e começa a rodar imediatamente.

Atualizando a interface (UI): Synchronize vs Queue.

A Thread não pode interagir diretamente na interface do programa.
Se fizer isso, pode acontecer um erro.

Por isso existem dois métodos que podem ser utilizados:

1. Synchronize → A thread pausa até o trecho sincronizado executar.

Aqui está a diferença correta:

Synchronize NÃO espera a thread terminar.
Ela pausa APENAS a thread secundária até que a Thread Principal (onde esta a interface com o usuário) execute aquele bloco sincronizado.

Ou seja:

✔ A thread secundária para naquele ponto.
✔ A thread principal executa o trecho sincronizado imediatamente.

Depois disso, a thread secundária continua.

Exemplo revisado:

TThread.CreateAnonymousThread(
  procedure
  begin
    Sleep(2000); // Simula um processo pesado

    TThread.Synchronize(nil,
      procedure
      begin
        ShowMessage('Processo concluído!');
      end
    );
  end
).Start;

Ideal para:

✔ Mostrar mensagem ao final
✔ Atualizar algo que precisa acontecer NA HORA
✔ Garantir ordem de execução

2. Queue → A thread NÃO pausa, e a UI executa quando puder.

O método Queue funciona assim:

A thread secundária não para atualizar a Main Thread.

Ela apenas coloca a tarefa na fila da thread principal.

A UI executa assim que possível, sem travar nada.

Exemplo revisado:

pbProgresso.Min := 0;
pbProgresso.Max := 100;

TThread.CreateAnonymousThread(
  procedure
  var
    i: Integer;
  begin
    for i := 1 to 100 do
    begin
      Sleep(50);

      TThread.Queue(nil,
        procedure
        begin
          pbProgresso.Position := i;
        end
      );
    end;
  end
).Start;

Excelente para:

✔ Barras de progresso
✔ Atualizações constantes
✔ Logs
✔ Labels e contadores

Fluxo de execução com Thread usando Synchronize e Queue no Delphi
Diagrama mostrando como a Thread criada usa Synchronize e Queue para atualizar a Main Thread no Delphi.

📌 Comparação rápida

RecursoA thread secundária pausa?Para que usar?
Synchronize Pausa até a UI rodar o blocoAções pontuais e ordenadas (ex.: ao final)
Queue Não pausaAtualizações contínuas e fluídas

Exemplos práticos para iniciantes.

Exemplo 1 – Executando tarefa pesada sem travar.

Thread.CreateAnonymousThread(
  procedure
  begin
    ExecutaProcessamentoDemorado();
  end
).Start;

Exemplo 2 – Mostrando mensagem ao terminar

TThread.CreateAnonymousThread(
  procedure
  begin
    GerarRelatorioPesado();

    TThread.Synchronize(nil,
      procedure
      begin
        ShowMessage('Relatório finalizado!');
      end
    );
  end
).Start;

Exemplo 3 – Atualizando ProgressBar em tempo real

TThread.CreateAnonymousThread(
  procedure
  var
    x: Integer;
  begin
    for x := 1 to 100 do
    begin
      Sleep(40);

      TThread.Queue(nil,
        procedure
        begin
          pbProgresso.Position := x;
        end
      );
    end;
  end
).Start;

Erros comuns ao usar Thread no Delphi (e como evitar).

✔ Acessar elementos da interface direto da thread
✔ Esquecer de usar Synchronize ou Queue
✔ Dividir variáveis entre threads sem proteção
✔ Criar threads demais
✔ Não tratar exceções internas
✔ Usar Sleep na thread principal
✔ Bloquear a UI com loops pesados

Saber disso te coloca anos à frente da maioria dos iniciantes.

Boas práticas essenciais.

✔ Prefira Anonymous Threads para tarefas simples
✔ Use Synchronize somente quando necessário
✔ Use Queue para atualizações contínuas
✔ Evite criar muitas threads ao mesmo tempo
✔ Nunca acesse a interface fora da thread principal
✔ Sempre trate exceções internas
✔ Não coloque código gigante dentro do Synchronize
✔ Documente o que cada thread faz
✔ Teste seu código com dados pesados
✔ Use logs (mesmo que simples)

Código completo para copiar, colar e testar!

procedure TForm1.btnProcessarClick(Sender: TObject);
begin
  pbProgresso.Min := 0;
  pbProgresso.Max := 100;

  TThread.CreateAnonymousThread(
    procedure
    var
      i: Integer;
    begin
      for i := 1 to 100 do
      begin
        Sleep(50);

        TThread.Queue(nil,
          procedure
          begin
            pbProgresso.Position := i;
          end
        );
      end;

      TThread.Synchronize(nil,
        procedure
        begin
          ShowMessage('Processamento concluído!');
        end
      );
    end
  ).Start;
end;

Perfeito para testar no Delphi imediatamente.

Conclusão!

Aprender a utilizar thread no Delphi é uma das habilidades mais importantes para quem quer programar Delphi de forma moderna e trazer para o usuário uma melhor experiência.

Hoje, ninguém aceita mais telas congeladas, e entendendo Threads, você consegue entregar:

✔ Aplicações mais fluidas
✔ UX muito mais profissional
✔ Códigos mais organizados
✔ Sistemas que passam confiança

Você deu um passo enorme ao entender isso — e agora está pronto para evoluir ainda mais.

Veja outros artigos para aprender ainda mais sobre Delphi e outras tecnologias!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *