![]() |
TIdTCPClient hängt sich bei ReadLn auf
Sers,
ich habe folgende Funktion um die Ankommenden Strings eines TIdTCPClients zu empfangen. Das funktioniert soweit auch gut, wenn ich aber versuche die Form zu verschieben hängt sich das Programm auf. Der "Rahmen" ,der beim verschieben angezeigt wird, friert ein und die Maus kann ich auch nicht mehr auf die Taskleiste ziehen vorher hält mich eine Unsichtbare Wand auf ... Das ganze kann man nur mach mit dem Taskmgr beenden. Das Interval des Timers ist 300, ein Antifreeze ist auch vorhanden mit einem IdleTimeOut von 250 und OnlyWhenIdle true.
Delphi-Quellcode:
greetz
procedure TForm1.Read_TimerTimer(Sender: TObject);
var s: string; begin try repeat Application.ProcessMessages; s := Command_TCP.ReadLn; if s <> '' then begin Listbox1.Items.Add(s); end; until s = ''; except Command_TCP.Disconnect; end; end; |
Re: TIdTCPClient hängt sich bei ReadLn auf
Setzt das Application.ProcessMessages mal ans Ende der repeat-Schleife.
|
Re: TIdTCPClient hängt sich bei ReadLn auf
Danke fuer deine Antwort, aber wenn ich das ProcessMessages ans Ende setzte gibt es keine Veränderung und das Programm stürzt weiterhin ab. :gruebel:
greetz |
Re: TIdTCPClient hängt sich bei ReadLn auf
Komisch, müsste eigentlich klappen. Nimm mal eine while-Schleife.
Delphi-Quellcode:
Oder du schreibst einfach so etwas in das OnRead/OnExecute-Event:
while s <> '' do begin
Application.ProcessMessages; s := Command_TCP.ReadLn; if s <> '' then begin Listbox1.Items.Add(s); end; end; Command_TCP.Disconnect;
Delphi-Quellcode:
MfG, Sebastian R.
// Indy-Beispiel
begin ListBox1.Items.Add(AThread.Connection.ReadLn); end; [EDIT]Ich habe nochmal deinen Text oben gelesen. Du hast ja eine Schleife in dem Timer drin. Der wartet solange bis was ankommt. Aber wenn der Interval auf 300 ms steht, dann führt der das ja zu oft aus![/EDIT] |
Re: TIdTCPClient hängt sich bei ReadLn auf
Zitat:
Auf wieviel soll ich den Timer denn dann stellen? Oder gibt es eine bessere Methode als das mit einem Timer zu realisieren? greetz |
Re: TIdTCPClient hängt sich bei ReadLn auf
Am besten wäre ein Thread, nach dem Motto
Delphi-Quellcode:
;)
try
repeat Application.ProcessMessages; s := Command_TCP.ReadLn; if s <> '' then begin synchronize (...); // String am Hautthreat weitergeben end; until s = ''; except Command_TCP.Disconnect; end; |
Re: TIdTCPClient hängt sich bei ReadLn auf
Wie meinst du das? Soll ich den ganzen Timer in einen Thread auslagern? Oder soll ich soll ich jedes mal im Timer Event einen neuen Thread createn?
greetz //Edit: Habe den Timer durch einen Thread mit einer Endlosschleife ersetzt. |
Re: TIdTCPClient hängt sich bei ReadLn auf
Das Empfangen von Daten mitteles eines Clienten klappt auch nur, wenn du etwas versendet hast. Ein Client ist zum Schicken da, nicht um zu Empfangen. Folgendes klappt zwar:
Delphi-Quellcode:
Da wird aber vom Server etwas zurückgeschickt. Wenn du nur Daten empfangen willst, dann nimm doch einen Server. Der kann auch antworten auf Client-Anfragen!
IdTCPClient1.Connect;
IdTCPClient1.WriteLn('hallo'); s := IdTCPClient1.ReadLn; IdTCPClient.Disconnect; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:16 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-2025 by Thomas Breitkreuz