Sua aplicação em Delphi pára de responder ao executar loops e afins?

por Marcos Elias

Vou trazer algumas dicas de Delphi por aqui :) Dicas e códigos úteis, funções, etc. Além de compartilhar algumas coisas que acabo encontrando quando preciso para mim mesmo.

Eu estava há um bom tempo sem mexer com Delphi, mas como estou trabalhando numa nova versão do AntiPolicy, resolvi aproveitar o espaço para compartilhar as dicas. Vamos lá com a primeira :)

Normalmente não será nada muito avançado, atendendo a estudantes de programação e programadores independentes. Mas podem ser úteis para mais gente.

Sua aplicação pára de responder ao executar alguns comandos?

Quando usamos loops ou tarefas que demoooram é comum que o programa pareça travado: a tela não atualiza (por exemplo, labels com mensagens para aguardar), a janela não pode ser movida e interromper o processo pode ser complicado. Mesmo que seja uma “travadinha” por alguns segundos, é uma experiência ruim para o usuário: ele pensa que o programa travou geral e parou de executar suas funções.

Para evitar isso é necessário que a aplicação processe as mensagens do sistema, como comandos para repintar a tela, movimentar a janela, minimizar, etc. No Delphi isso é feito chamando Application.ProcessMessages.

Simples: no seu loop, coloque Application.ProcessMessages; no código.

Se dentro do loop você executar tarefas que demoram, inclua uma chamada ao ProcessMessages também entre as chamadas dessas tarefas. Num caso mais extremo, eu tentaria com um Timer, mas nunca fiz essa “gambiarra” na prática (colocar um Timer com intervalo relativamente curto e o ProcessMessages no evento dele, desativando o Timer ao terminar a operação).

Caso não use loop mas faça coisas que podem demorar, coloque Application.ProcessMessages; entre as suas chamadas. Por exemplo, ao trabalhar com uma extensa quantidade de valores do registro, chame o ProcessMessages entre algumas operações.

Naturalmente não vale a pena colocar um monte de chamadas ao ProcessMessages caso a operação seja muito rápida, como ao ler algumas dezenas de chaves do registro na inicialização do programa.

Crie aplicações que respondam a comandos nativos do Windows (minimizar, fechar, etc). Forneça uma boa experiência de uso para os usuários. Ou clientes.


Dica extra: conheça o Turbo Delphi, versão oficial gratuita do Delphi! Ele tem algumas limitações geralmente contornáveis com relação a componentes de terceiros. Para saber mais, veja a página baixar o Delphi grátis.

comments powered by Disqus

Comentários arquivados

  1. Chrislley escreveu

    colocando em um timer funciona perfeito a aplicação nem trava

  2. escreveu

    Preciso chamar um SQLConnection que conecta o Firebird fora..

    Por ser via internet, demora um pouco pra conectar.. vou testar aqui o comando, pra ver se consigo fazer conectar, sem congelar a tela.

  3. Jhonny Oliveira escreveu

    Obrigado Marcos, faz um tempo que estava procurando por isso. Não imaginava que pudesse ser tão simples, funcionou perfeitamente para mim.