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?