Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdTCPClient.ReadLn kehrt nicht zurück!? (https://www.delphipraxis.net/11131-tidtcpclient-readln-kehrt-nicht-zurueck.html)

EConvertError 31. Okt 2003 15:46


TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Hallo!

Ich denke diese Frage wurde schon einmal gestellt, aber ich habe trotz langem Suchen nichts dazu finden können.
Das Problem ist simpel: Ich habe da in einem Thread Folgendes:
Delphi-Quellcode:
IdTCPClient1.ReadLn('', 5, -1);
Das ganze soll zum Empfangen der (Chat)Nachrichten dienen.
Wenn der Server eine Nachricht sendet, dann ist alles OK. Nur wenn gerade keine Nachricht da ist, dann kehrt die Funktion nicht zurück (bzw. erst wenn eine Nachricht kommt).
Es stört mich, weil derselbe Thread auch zum Verschicken der Nachrichten gebraucht wird und deshalb eben das Versenden blockiert ist.

Bis jetzt habe ich das Problem gelöst, indem ich vom Server jede Sekunde (mittels Timer) eine Art "Keep Alive" Signal zum Client gesandt habe.

Aber diese Lösung finde ich äußerst "unelegant". Weiß jemand eine Lösung, oder muss ich bei meiner bleiben?

mfg
EConvertError

PS: Ich arbeite mit Indy.

SirThornberry 31. Okt 2003 16:10

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Readtimeout setzen...

EConvertError 31. Okt 2003 16:37

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Hi!

Genau das wollte ich machen, aber das funktioniert nicht richtig.
Der zweite Parameter(die Nummer 5) sollte ja den Timeout darstellen.
Delphi-Quellcode:
IdTCPClient1.ReadLn('', 5, -1);
Aber irgendwie funktioniert das nicht. Ich benutze die mit der Delphi 7 Pro mitgelieferte Indy Version (9.0).

mfg,
EConvertError

Kamil 31. Okt 2003 16:45

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
mit IdTCPClient1.ReadTimeout:=100;

Christian Seehase 31. Okt 2003 16:47

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Moin EConvertError,

das die Angabe des Timeouts in Millisekunden angegeben wird, ist Dir aber schon klar? ;-)

EConvertError 31. Okt 2003 17:12

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Hallo!

Also im Prinzip weiß ich schon, dass die Angabe des Timeouts in Millisekunden angegeben wird. Die 5 Millisekunden habe ich vom Indy Chatdemo übernommen.

Ich habe es nun hiermit versucht:
Delphi-Quellcode:
 
if TCPClient.Connected= TRUE then begin
  TCPClient.ReadTimeout:= 100;
  fIncomingMsg:= TCPClient.ReadLn('', 100, -1);
end;
Aber irgendwie hat es nicht funktioniert. Was mache ich falsch? Warum zeigt das Timeout keine Wirkung?

Vielen Dank schon jetzt,
EConvertError

Basic-Master 31. Okt 2003 17:22

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
versuch es mal so:
Delphi-Quellcode:
if TCPClient.Connected= TRUE then begin
  TCPClient.ReadTimeout:= 2000;
  fIncomingMsg:= TCPClient.ReadLn('', 2000, -1);
end;

EConvertError 31. Okt 2003 17:51

Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
 
Hallo!

Also ich habe auch das probiert, aber es hat keine Wirkung gezeigt- leider.

Beim IdTCPDemo (bei den Indy Demos dabei) wird folgendes gemacht:
Man definiert den IdTCPClienten im Hauptthread und greift zum Lesen von einem anderen Thread aus darauf zu:

Delphi-Quellcode:
while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
end;
Und zum Schreiben wird im Hauptthread einfach Folgendes gemacht:

Delphi-Quellcode:
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
Darf man das tun? Ich meine: Kann es da nicht sein, dass der "Lese"- Thread gleichzeitig mit dem Hauptthread auf den IdTCPClienten zugreift? Beim Demo funktioniert es, aber...

mfg,
EConvertError


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz