ClientSocket - Requisição

15/03/2006

0

Galera, estou com o código a seguir

Query1.Open;
Query1.First;
While not Query1.Eof Do
Begin
i := 0;
ClientSocket.Host := Query1nmMaq.AsString;
ClientSocket.Active := True;
while not ClientSocket.Socket.Connected Do
Begin
Application.ProcessMessages;
i := i + 1;
if i > 50 Then Break;
End; //While
if ClientSocket.Active = True Then
Begin
ClientSocket.Socket.SendText(´RequestLetreiro´);
Sleep(1000);
End; //ClientSocket
Query1.Next;
ClientSocket.Active := False;
End;

e com a seguinte duvida...

Eu preciso mandar essa requisição para todos os usuarios logados a partir desta quer.
Só que o que acontece, de vez em quando fica o usuario logado mesmo ele nao estando, por exemplo , a maquina desligou sozinha.
Mas dento deste loop esle acaba passando muito rapido pelo active do componente socket e ele nao ativa a conexão. Fazendo com que nao envie a solicitação.

Gostaria de alguma dica de como evitar isto

Alguem poderia me dar uma ajudinha?!
no código acima impus um limite de tempo, mas nao esta funcionando corretamente.

Queria algo do tipo:
ele tenta a conexão com a maquina até um determinado instante, se nao conseguir, vai pra proxima maquina.

Obrigado e Aguardo Respostas.


Tremonti

Tremonti

Responder

Posts

16/03/2006

Ipc$

Coloque um timeout de conexão:
var tmp:DWord;
tmp := GetTickCount;
ClientSocket.Active := True; 
while not ClientSocket.Active and ((GetTickCount - tmp) < 5000) do 
begin 
  Application.ProcessMessages; 
  Sleep(1);
end;

Uma dúvida: pq vc faz Query1.First; após Query1.Open; ?


Responder

16/03/2006

Tremonti

Nao entendi seu codigo
em relação ao first... é porque ganho por linha...rs


Responder

16/03/2006

Ipc$

Bom, o código acima tenta a conexão com o TServerSocket durante 5 segundos. Vc também pode definir no evento onError do TClientSocket: ErrorCode := 0; assim se houver erro de conexão, a exceção não é lançada.


Responder

16/03/2006

Tremonti

nao deu certo cara

deu um erro de assychrnous


Responder

16/03/2006

Ipc$

Bom, comigo não dá erro. Verifique se o TServerSocket está no ar, se a porta está certa e se ele está aceitando a conexão no evento onAccept.
No meu caso, nunca passo o Host no TClientSocket e sim o Address.


Responder

22/03/2006

Tremonti

Assim Funciona, pra quem quizer!!!

Query1.Open;
While not Query1.Eof Do
Begin
tmp := 0;
ClientSocket.Host := Query1nmMaq.AsString;
ClientSocket.Active := True;

while ((ClientSocket.Active = False) And (tmp < 5)) do
Begin
try
Application.ProcessMessages;
except
Break;
end; //Try
tmp := tmp + 1;
Sleep(100);
End;

if ClientSocket.Active = True Then
Begin
ClientSocket.Socket.SendText(´RequestLetreiro´);
Sleep(100);
End //ClientSocket
else
Begin
Query1.Delete;
Query1.ApplyUpdates;
End;

ClientSocket.Active := False;
Query1.Next;
End;


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar