Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TIdTCPServer (Indy) und TClientSocket (https://www.delphipraxis.net/190871-tidtcpserver-indy-und-tclientsocket.html)

Bambini 17. Nov 2016 14:25

AW: TIdTCPServer (Indy) und TClientSocket
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1354025)
Aber ich muss nochmal fragen.
Delphi-Quellcode:
OnExecute
wird aufgerufen. Warum sehe ich dann wiederum keine Meldung; auch wenn ich die Ausgabe ganz an den Anfgang setze:
Delphi-Quellcode:
Procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
Var
   Data:String;
Begin
   ScrollLog('OnExecute();');
   Application.ProcessMessages;

   Data:= AContext.Connection.Socket.ReadLn(); //<--- Das wartet ewig, bis da etwas kommt
   Data:= Trim(Data);   // Sonder- und Leerzeichen entfernen
   TThread.Synchronize(nil,   // threadsicherer VCL-Zugriff
      Procedure()
      Begin
         ScrollLog('[Srv]: received:');
         ScrollLog('=> ' + Data);
      End);
End;

Das OnExecute() wird von jedem IndyThread gerufen und zwar alle Nase lang, wenn du da nix machst, kommt der sofort wieder.
Und das macht jeder Thread pro Connection, egal ob da etwas auf der Leitung angekommen ist oder nicht.
Mit ReadLn legst du den schlafen, bis ReadLn etwas zurück liefert.

PS: mit
Delphi-Quellcode:
 if AContext.Connection.Socket.Readable() then begin
kannst abfragen, ob da etwas zum lesen gibt.

stahli 17. Nov 2016 14:30

AW: TIdTCPServer (Indy) und TClientSocket
 
Ich denke (hoffe), dass folgendes zutrifft:


TForm1.IdTCPServerExecute(...) ist eine Ereignisbehandlung.

TForm1.KeyPress(...) auch.

KeyPress wird vom Mainthread selbst ausgelöst, wenn von Windows eine Message TasteGedrückt ansteht.
KeyPress läuft also innerhalb des Mainthreads und ist somit (Main-)Threadsafe.

IdTCPServerExecute wird jedoch von einem aus Indy erzeugten Thread heraus aufgerufen - also nicht aus dem Mainthread heraus.
Wenn dort irgendwelche Schweinereien gemacht werden, die den Mainthread bzw. das Formular berühren, dann kann das zu Problemen führen.

Innerhalb eines Thread-Kontextes sollte man nie Application.ProcessMessages und nie ShowMessages o.ä. aufrufen.
Aufrufe, die den Mainthread berühren müssen über Synchronize aufgerufen werden, damit es keine Zugriffskonflikte mit dem Mainthread gibt.

2 Threads, die da weiterhelfen können:
http://www.delphipraxis.net/190294-p...alsection.html
http://www.delphipraxis.net/190675-c...mziehen-2.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz