ClientSocket - Requisição
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.
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
Curtidas 0
Respostas
Ipc$
15/03/2006
Coloque um timeout de conexão:
Uma dúvida: pq vc faz Query1.First; após Query1.Open; ?
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; ?
GOSTEI 0
Tremonti
15/03/2006
Nao entendi seu codigo
em relação ao first... é porque ganho por linha...rs
em relação ao first... é porque ganho por linha...rs
GOSTEI 0
Ipc$
15/03/2006
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.
GOSTEI 0
Tremonti
15/03/2006
nao deu certo cara
deu um erro de assychrnous
deu um erro de assychrnous
GOSTEI 0
Ipc$
15/03/2006
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.
No meu caso, nunca passo o Host no TClientSocket e sim o Address.
GOSTEI 0
Tremonti
15/03/2006
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;
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;
GOSTEI 0