![]() |
TidTCPClient + ReadLn = hängt Programm auf
moin,
wenn ich mit einem Timer(100), text mittels ReadLn('', 5) abfragen will, wird mein Programm blockiert/aufgehängt wie kann man das ändern? |
Re: TidTCPClient + ReadLn = hängt Programm auf
indem man herausfindet wo sich das Programm aufhängt ;-)
Ich dachte zuerst an ein Problem bei ATerminator = '', jedoch macht das nichts weil ReadLine das bereits abfängt.
Delphi-Quellcode:
Ich würde also einfach mal mit durch den Indy Quellcode steppen und schauen was passiert.
// User may pass '' if they need to pass arguments beyond the first.
if Length(ATerminator) = 0 then begin ATerminator := LF; end; |
Re: TidTCPClient + ReadLn = hängt Programm auf
nja, das hilft mir nicht weiter
|
Re: TidTCPClient + ReadLn = hängt Programm auf
Setze einen Haltepunkt vor ReadLine und steppe mit F7 durch den Quellcode bis Dein Programm hängt. Untersuche danach die Zeile(n) die unmittelbar davor verarbeitet wurde(n).
|
Re: TidTCPClient + ReadLn = hängt Programm auf
Delphi-Quellcode:
wie kann man das ändern?
procedure Tfrm_main.Timer2Timer(Sender: TObject);
begin if server.Connected then begin tmptxt := server.ReadLn(':cmd\*\'); //<-- das ist der auslöser, es passiert nur dann was, wenn inhalt an kommt ;) timer1.Enabled := true; end; end; |
Re: TidTCPClient + ReadLn = hängt Programm auf
Probiers mal mit nem Thread ;)
|
Re: TidTCPClient + ReadLn = hängt Programm auf
wie?
ich weis nicht wie man threads bei TidCTCPlient benutzt |
Re: TidTCPClient + ReadLn = hängt Programm auf
Naja ... das ReadLn in nen Thread verlagern und wenn was da ist, mit synchonize() ein Event auslösen ...
|
Re: TidTCPClient + ReadLn = hängt Programm auf
und wie macht man das?
|
Re: TidTCPClient + ReadLn = hängt Programm auf
Ich weiß nicht was jetzt ein Thread da noch soll. Mir stellt sich die Frage ob das Client-Server-Prinzip hier überhaupt richtig angewendet wird. Die paar Brocken, die von thetrue geschrieben wurden deuten darauf hin, daß der Server sendet sobald ein Verbindung zum Client besteht. Ich könnte ich mir sowas vorstellen wenn der Server alle Client über irgendwas informieren will. Der normale Weg wäre allerdings, daß der Client den Server etwas fragt und der Server entsprechend antwortet. Oder anders: der Client sendet ein Kommando und der Server "serviert" das Ergebnis. Was genau gemacht werden soll ist mir aber nicht bekannt, da sollte thetrue nachlegen.
Des Weiteren werden Daten die per WriteLn am Server verschickt werden mit LF ($0A) abgeschlossen (terminiert). thetrue stellt als Terminator aber ':cmd\*\' ein. Absicht??? In meiner ersten Antwort hatte ich angeregt per Debugger in den Indy Quellcode zu springen. Was ist daraus geworden? Die Aussage der Fehler tritt bei ReadLn auf ist mir zu einfach. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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