Einzelnen Beitrag anzeigen

Carsten Hölscher

Registriert seit: 29. Jul 2008
73 Beiträge
 
Delphi 11 Alexandria
 
#1

TCP-Server von Indy 9 auf 10 bringen

  Alt 30. Mär 2021, 00:11
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
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:
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
  Mit Zitat antworten Zitat