![]() |
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:
Das ganze soll zum Empfangen der (Chat)Nachrichten dienen.
IdTCPClient1.ReadLn('', 5, -1);
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. |
Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
Readtimeout setzen...
|
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:
Aber irgendwie funktioniert das nicht. Ich benutze die mit der Delphi 7 Pro mitgelieferte Indy Version (9.0).
IdTCPClient1.ReadLn('', 5, -1);
mfg, EConvertError |
Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
mit IdTCPClient1.ReadTimeout:=100;
|
Re: TIdTCPClient.ReadLn kehrt nicht zurück!?
Moin EConvertError,
das die Angabe des Timeouts in Millisekunden angegeben wird, ist Dir aber schon klar? ;-) |
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:
Aber irgendwie hat es nicht funktioniert. Was mache ich falsch? Warum zeigt das Timeout keine Wirkung?if TCPClient.Connected= TRUE then begin TCPClient.ReadTimeout:= 100; fIncomingMsg:= TCPClient.ReadLn('', 100, -1); end; Vielen Dank schon jetzt, EConvertError |
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; |
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:
Und zum Schreiben wird im Hauptthread einfach Folgendes gemacht:
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;
Delphi-Quellcode:
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...
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
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