Einzelnen Beitrag anzeigen

LokutusvB

Registriert seit: 18. Jul 2006
277 Beiträge
 
Delphi XE6 Enterprise
 
#3

AW: TCP-Verbindung zu mehreren Endgeräten

  Alt 19. Feb 2018, 15:39
Hi himitsu,

danke für deine klärenden Worte. Ich bin ein großes Stück weiter gekommen, bin mir aber nicht sicher, ob diese Lösung "sauber" und fehlerfrei Seitens Delphi Threads ist.

In meiner Hauptform habe ich ein type tcpDataClients als Record angelegt:

Delphi-Quellcode:
tcpDataClients = record
 recIndex: Integer;
 tsC: TidTCPClient;
 ...
end;
Hier werden unter anderem der Indy-Client und der Index pro Server, mit dem ich mich verbinden muß, abgelegt. Da das ganze variabel gehalten werden muß, habe ich ein Array des Records vereinbart und lese in FormCreat aus einer Ini-Datei die IP-Serveradressen ein und erzeuge die Indy-Clients. Anschließend werden die Verbindungen hergestellt.

Jetzt folgt der Teil, in dem ich mir nicht sicher bin, ob das ausfallsicher ist.

In einer Thread-Klasse übergebe ich im Konstruktor eine Variable an eine als private deklarierte Variable der Thread-Klasse. In jedem anderen Beispiel im Netz, das ich während meiner Suche gefunden habe, wird immer mit einem Pointer gearbeitet (wahrscheinlich da nur eine Variable genutzt wird).

Delphi-Quellcode:
Constructor TT_Lesen.Create;
begin
  Inherited Create(False);
  tcpRecIndex := Variable;
end;
Nun kann der Datenabruf der einzelnen Indy-Clients beginnen.

Delphi-Quellcode:
procedure TF_Main.Start;
var
  ii: Integer;
begin
  for ii := 0 to Length(tcpCls) - 1 do begin
    tcpCls[ii].recIndex := ii;
    tcpCls[ii].Lesen_Thread := TT_Lesen.Create(tcpCls[ii].recIndex);
    tcpCls[ii].Lesen_Thread.Priority := tpNormal;
    tcpCls[ii].Lesen_Thread.Resume();
  end;
end;
Diese ist noch ganz einfach gehalten, ohne Kontrolle ob ein Thread bereits aktiv ist. Darum geht es mir aber auch nicht, sondern die Variable, die übergeben wird. Der Variable recIndex wird der Wert der Schleifenvariable zugewiesen und dem Thread übergeben. Im Thread wird diese tcpRecIndex vergeben und im Thread kann so dank dem Index das richtige Array Record Element angesprochen werden. Wie z.B.
txt := Trim(F_Main.tcpCls[tcpRecIndex].tsC.IOHandler.ReadLn());
Ist diese Lösung fehleranfällig oder kann man das in die Praxis umsetzen? Oder ist es besser, wenn ich direkt den Record an den Thread übergebe?
MFG
LokutusvB

Geändert von LokutusvB (19. Feb 2018 um 16:08 Uhr)
  Mit Zitat antworten Zitat