Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TCP-Server von Indy 9 auf 10 bringen (https://www.delphipraxis.net/207496-tcp-server-von-indy-9-auf-10-bringen.html)

Carsten Hölscher 29. Mär 2021 23:11

TCP-Server von Indy 9 auf 10 bringen
 
Ich bin leider gezwungen, meine tadellos funktionierenden Netzwerkfunktion von Indy 9 auf 10 zu bringen, da Indy 9 die webDAV-Komponente nicht hat. Wie schon im Nachbarthema besprochen, ist die Doku dazu leider eher übersichtlich. Vielleicht hilft ja ein kleiner Überblick über meine bereits erfolgreichen Schritte mal anderen. Also in Indy 9 definiert man seinen eigenen Thread
Delphi-Quellcode:
TMeinThread = class(TIdPeerThread)
  procedure MacheWas;
end;
In Indy 10 geht das so:
Delphi-Quellcode:
TMeinThread = class(TIdThreadWithTask)
  procedure MacheWas;
end;
Dann hat man in Indy 9 eine TIdTCPServer-Komponente benutzt und vor dem möglichen Aufbau der Verbindung
Delphi-Quellcode:
IdTCPServer1.ThreadClass:=TMeinThread;

definiert. Damit wurde für jede eingehende Verbindung eine Instanz von TMeinThread erzeugt.

In Indy 10 braucht man für dieses Verhalten neben der Serverkomponente noch eine Komponente TIdSchedulerOfThreadDefault und stellt beim Server die Eigenschaft Scheduler auf diese Komponente. Und wieder vor dem möglichen Aufbau der Verbindung:
Delphi-Quellcode:
IdSchedulerOfThreadDefault1.ThreadClass:=TMeinthread;


In der execute-Methode kam man unter Indy 9 folgendermaßen an seinen Thread:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
  TMeinthread(AThread).MacheWas;
end;
Unter Indy 10 geht das so:
Delphi-Quellcode:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
  TMeinthread(TIdYarnOfThread(AContext.Yarn).Thread).MacheWas;
end;

Und jetzt hab ich den Eindruck, dass sich das Verhalten der connection was geändert hat. Unter Indy 9 war das ja ein member des Threads. Ich hab es jetzt als eigenes Member ergänzt und setze es beim connect auf AContext.Connection, um dann später Daten drüber zu verschicken/empfangen.
Meine Anwendung macht dafür einen weiteren Thread zum Versenden, der nicht blockierend ist, während das Lesen der Daten im "TMeinthread" blockieren ist. Beides nutzt j dieselbe connection, was bisher auch tadellos lief. Jetzt verhält sich das Ganze aber seltsam. ich hab's noch nicht ganz durchdrungen, es scheint aber so zu sein, dass der Sendethread auch auf den Lesethread rückwirkt oder sowas.
Kann mir jemand einen Denkanstoß geben?

Carsten

Carsten Hölscher 31. Mär 2021 01:08

AW: TCP-Server von Indy 9 auf 10 bringen
 
Mein Problemwar wohl nur ein dummer Programmierfehler. Also da läuft sonst alles wie früher, wenn man meine Änderungen oben eingebaut hat.

Carsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 Uhr.

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