Fórum ProcessMessages #266076
20/01/2005
0
grato desde jah, aguardo respostas obrigado a todos que postarem.
Crashovewrite
Curtir tópico
+ 2Post mais votado
21/01/2005
Tenho um parecer contrário ao que foi exposto. No help, temos a seguinte citação:
Ou seja, interrompe a execução de uma aplicação para que ela consiga processar a fila de mensagens. Em seguida, ainda no help, diz que ao chamar ProcessMessages a fila é processada até [b:d7e50bb691]esvaziar[/b:d7e50bb691].
Chamando o método dentro de um laço (while, for, etc) não conseguiremos perceber perda de performance nem com o auxílio de um cronometro, exceto, se dentro do loop existir alguma rotina para exibir dados em tela que obrigue repintar a mesma, ou ainda, se o usuário ficar movendo o formulário de lugar.
Na pratica, utilizem o código abaixo para testar. É importante notar que, vários testes podem variar em muito com ou sem o uso do método.
procedure TForm1.Button1Click(Sender: TObject); var I: Int64; Arquivo: TextFile; TempDir: String; begin sb.Panels[1].Text := TimeToStr(Time); TempDir := ´C:\TEMP´; ForceDirectories(TempDir); AssignFile(Arquivo,TempDir+´\TempFile.txt´); ReWrite(Arquivo); I := 0; while I <= 1000000 do begin I := I + 1; WriteLn(Arquivo, StringOfChar(Chr(65),132)); Application.ProcessMessages; // Comente esta linha para testes end; CloseFile(Arquivo); sb.Panels[3].Text := TimeToStr(Time); ShowMessage(´Ok´); end;
Este é um exemplo simples, porém, podemos perceber que o processamento das mensagens, normalmente, sempre será mais rápido que outras atividades executadas pela aplicação.
Aroldo Zanela
Gostei + 4
Mais Posts
20/01/2005
Isabelct
Em outras palavras, ele serve para executar coisas que deixaram de ser executadas porque tem uma outra tarefa mais ´pesada´ sendo executada...
Uma situação prática: Você está copiando dados de um banco de dados para outro. Isso é uma tarefa ´pesada´, que exige bastante recursos do seu computador. Ao executá-lo, ele ficará com uma aparência de ´pendurado´, não redesenhando a tela e tal. Então, você pode executar o Application.ProcessMessages, para redesenhr a sua tela.
Este foi só um exemplo, mas no geral é para coisas assim que ele é utilizado.
Apenas um aviso: Use com cuidado este comando, e não o utilize dentro de laços de repetição! O seu custo (no sentido de tempo) é muito alto e muitas vezes não compensa, pois causa perda de performance.
Gostei + 3
20/01/2005
Paulo_amorim
Entretanto às vezes é necessário...
Uma situação:
Um Laço muito extenso, com vários comandos e que faz várias transações no banco, por exemplo, pode possuir um botão CANCELAR. Se a pessoa clicar nesse botão, o processo eh parado, e para isso vc precisa do ProcessMessages
Mas, como ela disse, muitas vezes não compensa pelo desempenho e tempo. Vale avaliar os fatos
Até+
Gostei + 2
20/01/2005
Isabelct
Com certeza às vezes é necessário, mas é preciso saber ponderar... Por exemplo, se o ProcessMessages precisa ficar dentro de um laço de repetição, ele não precisa ser executado em toda iteração, pode-se colocar um contador, e a cada 100 iterações (ou um número que fique bom para o sistema) executá-lo.
if Contador mod 100 = 0 then Application.ProcessMessages; Inc(Contador);
Mas ao utilizar o Application.ProcessMessages, o bom-senso é sempre a melhor companhia :-)
Gostei + 2
21/01/2005
Crashovewrite
Um abraço a todos os cuecas e um beijo para a isabelct.
Gostei + 1
Clique aqui para fazer login e interagir na Comunidade :)