TThread e Sleep

Delphi

21/07/2004

Olá colegas!
Por exemplo, neste código:
procedure TMyThread.Execute;
begin
  While not Terminated and Socket.Connected do
  begin
    if Socket.ReceiveLength > 0 then
      ProcesseComando;
    Sleep(1);
  end;
end;

Existiria outro comando sem ser Sleep e sem ´travar´ as outras threads ?
Obs: Application.ProcessMessages deixa a cpu em 100¬ de uso.


Persist

Persist

Curtidas 0

Respostas

Beppe

Beppe

21/07/2004

Vc quer travar apenas esta [b:449824060a]uma[/b:449824060a] thread? Então é Sleep mesmo. Desta forma, o desempenho da CPU não é prejudicado. Vc pode usar um laço vazio para gastar um pouco de tempo, mas assim consome processamento. Qual o problema com Sleep?


GOSTEI 0
Persist

Persist

21/07/2004

Todas as threads executam esse mesmo método.
Não há problema nenhum em utilizar Sleep, é que fica sempre em loop contínuo do While.
Pensei no Application.HandleMessage, mas mesmo vindo a informação pelo Socket p/ processar o comando, ele fica travado.


GOSTEI 0
Beppe

Beppe

21/07/2004

Quando vc chama Sleep, apenas a thread corrente adormece, as outras, mesmo sendo da mesma classe, não, só quando elas chamarem Sleep. O que está tentando fazer?


GOSTEI 0
Persist

Persist

21/07/2004

É um servidor que processa n clientes conectados por Sockets.
Daí quando o cliente solicita alguma coisa, o servidor processa e envia o resultado. Então abro uma thread no servidor quando o cliente se conecta, mas não queria que ficasse sempre em looping e sim que ela ficasse latente, ou seja, quando vem a informação, a thread executa.
Antigamente abria e fechava as threads só quando viesse a informação, mas dava muitos erros de violação, então a thread fica sempre no ar.
Muitas vezes o cliente está conectado, sem fazer nada e a thread no servidor fica lá em looping de bobeira.


GOSTEI 0
Beppe

Beppe

21/07/2004

Entendi...mas o problema então é o loop em si, não a chamada a Sleep. O que vc pode fazer, é usar eventos do socket, eu não mexo com isso mas tenho quase certeza que eles existem, assim vc só processa quando recebe.


GOSTEI 0
Persist

Persist

21/07/2004

Bom, isso seria em dar Suspend e Resume.
Pensei que poderia existir algo como o HandleMessage que pára naquela instrução até que chegue alguma mensagem e daí prosseguir o loop.


GOSTEI 0
POSTAR