Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdTCPClient hängt sich bei ReadLn auf (https://www.delphipraxis.net/63137-tidtcpclient-haengt-sich-bei-readln-auf.html)

Win32.API 14. Feb 2006 13:07


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:
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;
greetz

Sebastian R. 14. Feb 2006 13:30

Re: TIdTCPClient hängt sich bei ReadLn auf
 
Setzt das Application.ProcessMessages mal ans Ende der repeat-Schleife.

Win32.API 14. Feb 2006 13:36

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

Sebastian R. 14. Feb 2006 13:45

Re: TIdTCPClient hängt sich bei ReadLn auf
 
Komisch, müsste eigentlich klappen. Nimm mal eine while-Schleife.

Delphi-Quellcode:
while s <> '' do begin
  Application.ProcessMessages;
  s := Command_TCP.ReadLn;
  if s <> '' then
  begin
    Listbox1.Items.Add(s);
  end;
end;
Command_TCP.Disconnect;
Oder du schreibst einfach so etwas in das OnRead/OnExecute-Event:

Delphi-Quellcode:
// Indy-Beispiel
begin
  ListBox1.Items.Add(AThread.Connection.ReadLn);
end;
MfG, Sebastian R.

[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]

Win32.API 14. Feb 2006 14:02

Re: TIdTCPClient hängt sich bei ReadLn auf
 
Zitat:

Zitat von Sebastian R.
Komisch, müsste eigentlich klappen. Nimm mal eine while-Schleife.

Delphi-Quellcode:
while s <> '' do begin
  Application.ProcessMessages;
  s := Command_TCP.ReadLn;
  if s <> '' then
  begin
    Listbox1.Items.Add(s);
  end;
end;
Command_TCP.Disconnect;
Oder du schreibst einfach so etwas in das OnRead/OnExecute-Event:

Delphi-Quellcode:
// Indy-Beispiel
begin
  ListBox1.Items.Add(AThread.Connection.ReadLn);
end;
MfG, Sebastian R.

[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]

OK das mit der while Schleife bringt nix, TIdTCPClient hat kein OnRead oder OnExecuet Event.
Auf wieviel soll ich den Timer denn dann stellen? Oder gibt es eine bessere Methode als das mit einem Timer zu realisieren?


greetz

jfheins 14. Feb 2006 14:05

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;
;)

Win32.API 14. Feb 2006 14:19

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.

Sebastian R. 15. Feb 2006 07:41

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:
IdTCPClient1.Connect;
IdTCPClient1.WriteLn('hallo');
s := IdTCPClient1.ReadLn;
IdTCPClient.Disconnect;
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!


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