Hallo,
ich habe dieses Thema bereits im Delphi-PRAXiS-Forum eröffnet. Leider jedoch bekomme ich keine Antwort. Vielleicht kann mir hier jemand helfen.
Ich habe eine variable Anzahl von Servern im Netz, mit denen ich mich verbinden muß. Deren IP-Adressen werden in eine INI-Datei gespeichert (diese kann sich aber jederzeit ändern). Umsetzen möchte ich das Projekt in Delphi XE6 unter Verwendung der Indy-Komponenten.
Für das Verwalten der Verbindungsinformationen und der Indy-Clients habe ich mir ein Rord angelegt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| tcpDataClients = record recIndex: Integer; tsC: TidTCPClient; tIp: String; ... end; |
Daraus erstelle ich in variables Array, lese die IP aus der INI-Datei und erzeuge die Indy-Clients, mit denen ich mich anschließend verbinde.
Die Informationen der Server erhalte ich bei ReadLn() der Indy-Komponenten. Hierfür habe ich mir eine Thread-Klasse erstellt. Um jeder erzeugten Instanz dieser Klasse eine Indy-Komponente zuordnen zu können, übergebe ich im Constructor eine Variable:
Delphi-Quelltext
1: 2: 3: 4: 5:
| Constructor TT_Lesen.Create; begin Inherited Create(False); tcpRecIndex := Variable; end; |
Mit Hilfe einer For-Schleife kann ich nun die Thread-Instanzen erzeugen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| 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; |
und die Indy-Clients können im Htread bei den Servern die Informationen einholen.
Delphi-Quelltext
1:
| txt := Trim(F_Main.tcpCls[tcpRecIndex].tsC.IOHandler.ReadLn()); |
Das ganze funktioniert bei 2 bis 3 Clients sehr gut. Allerdings habe ich oft gehört, daß Delphi Threads Probleme bereiten sollen, inbesondere wenn man auf Variablen einer Form zugreift. Deswegen habe ich für jeden Indy-Client im Record die recIndex angelegt. Beispiele im Netz findet man leider sehr wenig, und wenn dann arbeiten die Leute mit Pointern.
Deswegen wollte ich wissen, ob meine Lösung "sauber" und ausfallsicher ist oder ob dabei zu Zugriffsfehlern auf den Record-Index kommen kann. Oder aber ob es vielleicht besser wäre, dem Thread direkt das Record-Objekt zu übergeben.