verificar sem congelar o sistema.

Delphi

06/08/2007

Bom dia,

No evento onshow de um form, eu verifico se um determinado host, está conectado (componente idhttp).

Nessa verificação eu utilizo o ´try´ etc...
Mas tem um problema...

toda vez que eu abro este form, o programa fica ´congelado´ por alguns segundos.

Como faço para executar este procedimento em segundo plano ?

Evitando o congelamento de ´alguns segundos´ sem verificar se está ou não está conectado.

Obrigado

Obrigado


Unix

Unix

Curtidas 0

Respostas

Titanius

Titanius

06/08/2007

Você pode usar Thread, assim ele verificaria em segundo-plano...

[]s


GOSTEI 0
Unix

Unix

06/08/2007

Complicado eu não encontro respostas no fórum, o pessoal só pergunta sobre este assunto.

Você tem algum exemplo sobre Thread ?

Eu preciso de algo simples...

  try
    IdHTTP.Connect();
  except
    updatefile.Free;
  end;

  if IdHTTP.Connected then
  begin
 codigo
end;



GOSTEI 0
Unix

Unix

06/08/2007

Sem thread, existe outra solução ?


GOSTEI 0
Diegus

Diegus

06/08/2007

Sem thread, existe outra solução ?


Application.ProcessMessages

Talvez ajude... não tenho certeza


GOSTEI 0
Massuda

Massuda

06/08/2007

Sem thread, existe outra solução ?
Indy bloqueia/congela a execução até que a operação do socket se complete. A única alternativa seria usar um componente de HTTP que usasse eventos para indicar que a operação do socket completou, como, por exemplo, o [url=http://www.overbyte.be/]ICS[/url]. Claro, seu código existente precisará ser refeito para funcionar com o ICS.


GOSTEI 0
Unix

Unix

06/08/2007

[quote:ae477a2c15=´unix´]Sem thread, existe outra solução ?


Application.ProcessMessages

Talvez ajude... não tenho certeza[/quote:ae477a2c15]

Em uma lista, um usuário postou isso:

só vc implementar uma conexao não sincronizada! 
e ficar dando app.processmessages!!


Mas eu não entendi como, e onde utilizar isso.


obrigado


GOSTEI 0
Massuda

Massuda

06/08/2007

só vc implementar uma conexao não sincronizada! 
e ficar dando app.processmessages!!
Mas eu não entendi como, e onde utilizar isso.
É basicamente o que escrevi no meu primeiro post neste tópico... Indy usa conexão síncrona/sincronizada por isso bloqueia/congela o seu programa. Se você usar comunicação via socket assincrona/não-sincronizada seu programa não congela.

O jeito mais fácil seria usar ICS ou os componentes padrão do Delphi para comunicação via socket. Não posso dar um exemplo do ICS pois nunca usei ele pra valer.


GOSTEI 0
Bruno Belchior

Bruno Belchior

06/08/2007

Massuda, mesmo que o acesso esteja no escopo de uma outra Thread, o Indy congelaria o sistema?


GOSTEI 0
Massuda

Massuda

06/08/2007

[quote:6eca963cc6=´Bruno Belchior´]mesmo que o acesso esteja no escopo de uma outra Thread, o Indy congelaria o sistema?[/quote:6eca963cc6]Não... ele congela apenas a thread onde a transferencia de dados está sendo feita. Claro, se seu programa pára esperando por essa thread, seu programa também congela.


GOSTEI 0
Felipeaj

Felipeaj

06/08/2007

Se você colocar um Application.ProcessMessages no OnWorkProgress, ajuda um pouco (mas ainda não fica 100¬ ´estável´ o sistema)

Ajudou um pouco baixar o tamanho dos pacotes, ficou um pouco melhor

Espero te ajudado!
Felipe


GOSTEI 0
Eselvati

Eselvati

06/08/2007

Existe um componente idantifreeze do indy, talvez ele melhore o procedimento







Ederson Selvati.


GOSTEI 0
POSTAR