Fórum ReadLn do Indy #299533
14/10/2005
0
Meu programa tava ficando lento com o tempo fiz testes pra descobrir oq é...
Eu fiz um código que repete uma thread varias vezes em sequencia assim:
memo1.linces.add(´->>´); linha := form1.IdTCPClient1.ReadLn(´´,500); memo1.linces.add(´<<-´);
O resultado me exclareceu o por que da lerdeza do programa.. o memo ficou assim:
->>
->>
->>
->>
->>
->>
Então descobri que os novos thread iniciavam mas nunca terminavam por causa do ReadLn.. E eu coloco o tempo de abordar.. ja botei outros tempos.. e nada.. ele não passa dali no código enquanto nao tiver uma line pra ler...
O que há de errado?
Amon-ra
Curtir tópico
+ 0Posts
14/10/2005
Amon-ra
memo1.lines.add(´->>´); linha := form1.IdTCPClient1.ReadLn(´´,500); memo1.lines.add(´<<-´);
Gostei + 0
14/10/2005
Massuda
Gostei + 0
14/10/2005
Amon-ra
que cria a Thread que interpretará as mensagens:
procedure Tlincenet.Timer1Timer(Sender: TObject); var t : checamsg; begin if IdTCPClient1.Connected then begin t := checamsg.Create(false); end; end;
A thread é criada assim...
procedure checamsg.Execute; var // ....(muita coisa).... // begin lincenet.debug(´<-´); // Mesmo q memo1.lines.add millisegundos := mili.wMilliseconds; //Meus testes do porque da lentidao linha := lincenet.IdTCPClient1.ReadLn(´´); ... muita coisa ... millisegundos := mili.wMilliseconds - millisegundos; lincenet.debug(´->´ + FloatToStr(millisegundos)); Terminate;
Ou seja o código tá sendo executado na Thread..
que é criada com Timer..
e não passa do ´readLn´ enquanto nao tiver algo pra ler...
Estou usando o Indy que veio junto com o Delphi 7..
Valeu!
Gostei + 0
14/10/2005
Massuda
[quote:02919d9ba8=´Amon-Ra´]que cria a Thread que interpretará as mensagens:[/quote:02919d9ba8]Do jeito que você fez, está criando inúmeras threads que ficarão esperando o servidor enviar alguma coisa. (Não sei o que acontece nesse caso)
Me parece que seu programa é algo do tipo troca de mensagens (um Messenger?).
Nesse caso, se seu protocolo permitir(*), tenha apenas uma única thread para ler as mensagens do servidor, algo parecido com o que você já está fazendo, mas use uma única thread.
(*) Se o seu protocolo permite ao cliente enviar mensagens sem precisar esperar por alguma confirmação do servidor (e vice-versa), é fácil usar uma única thread; se tiver confirmação envolvida, fica mais complicado, pois será preciso ter um mecanismo para associar as confirmações recebidas com os envios feitos. Se seu protocolo for muito complicado, talvez seja mais fácil ter um TIdTCPServer no cliente que receberia uma conexão de um TIdTCPClient no servidor (isso é complicado até para descrever!).
O timer não é preciso, pois você pode fazer uma thread que detecta que está conectado, aguarda receber algo e fica assim até desconectar ou você abortar.
Com relação à thread em si...[list:02919d9ba8][*:02919d9ba8]Seu código de debug parece estar inserindo mensagems num Memo... nesse caso, você precisa usar Synchronize para interagir com a UI[*:02919d9ba8]Não chame Terminate de dentro do Execute, se for para terminar a thread, simplesmente retorne da procedure Execute; Terminate é usado para outra thread pedir para sua thread parar (sua thread devia testar se Terminated é True).[/list:u:02919d9ba8]
[quote:02919d9ba8=´Amon-Ra´]e não passa do ´readLn´ enquanto nao tiver algo pra ler... [/quote:02919d9ba8]Eu não usaria ReadLn(´´, ...) porque ReadLn significa ler dados até encontrar o terminador, que no seu caso é uma string vazia (o default é o caractere LF). Não sei o que acontece nessa situação; teoricamente, o timeout deveria abortar a leitura.
[quote:02919d9ba8=´Amon-Ra´]Estou usando o Indy que veio junto com o Delphi 7[/quote:02919d9ba8]Com relação a versão do Indy, o ideal seria atualizar para a versão 9.0.18 (estável) ou 10 (em desenvolvimento). Dê uma olhada [url=http://forum.clubedelphi.net/viewtopic.php?t=57069&highlight=instalar+indy]neste tópico[/url] para ver como atualizar seu Indy.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)