Einzelnen Beitrag anzeigen

Benutzerbild von gubbe
gubbe

Registriert seit: 8. Okt 2005
Ort: Schleswig-Holstein
146 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Daten abholen bei TCPClient

  Alt 2. Jan 2025, 13:25
InputBufferIsEmpty wird wahrscheinlich immer True ergeben und somit kommt es nie zum ReadLn.

Der InputBuffer wird erst gefüllt, wenn überhaupt etwas abgefragt wird. Nimm die Prüfung auf InputBufferIsEmpty mal raus, dann wird es wahrscheinlich funktionieren.
Testweise kannst auch probieren, vor dem InputBufferIsEmpty TCPClient.IOHandler.CheckForDataOnSource aufzurufen. Das prüft überhaupt erst, ob ein Daten vorhanden sind.

Die Lösung mit dem Timeout würde ich aber nochmal überdenken. Du hast auch kein richtiges Kriterium dafür, wann die Daten vollständig gelesen wurden. Das könnte z.B. eine empfangene Leerzeile sein oder das Schließen der Verbindung.
Also eine Schleife in der Art "while Connected do"

Sinnvoller ist es aber auf jeden Fall, das ganze in einen Thread auszulagern. Dann kann Du auch direkt ReadLn aufrufen, ohne zu prüfen, ob Daten vorhanden sind, da nur dieser Thread und nicht die Benutzeroberfläche (der Main-Thread) blockiert wird. Das ProcessMessages rauszunehmen hat ja jetzt auch nur bewirkt, das das Programm einfriert, solange auf Daten gewartet wird.

Warum es mit dem Timer trotzdem funktionierte, kann ich nicht sagen. Evtl. wird InputBufferIsEmpty irgendwann nach dem Schließen der Verbindung False und in der Funktion ReadData brichst Du durch den Timeout schon früher ab. Der Timer ist aber auch keine gute Lösung.
  Mit Zitat antworten Zitat