Der Zugriff in der for-Schleife erfolgt eben nicht synchronisiert
Die erste Verwendung von
frm_main.lv_waagen.Items.Count-1 ist nicht synchronisiert, die zweite schon.
Warum?
Weil du das so programmiert hast?
Ach so, jetzt hab ich verstanden, was Bernhard damit meinte. Der zweite Aufruf von frm_main.lv_waagen.items.count ist ja für meinen Programmablauf nicht kritisch und diente lediglich den Protokollzwecken.
Gut, ich sollte vielleicht die gesamte Schleife synchronisieren.
Delphi-Quellcode:
FCS.Acquire;
// nicht synchronisierter Zugriff auf eine VCL-Komponente
for I := 0
to frm_main.lv_waagen.Items.Count-1
do
begin
Synchronize(
Procedure
begin
// hier ist es synchronisiert
frm_main.Writelog('
Sende Register '+inttostr(i)+'
von '+inttostr(frm_main.lv_waagen.Items.Count-1));
end
);
FTCPClient.SendCmd('
Register:'+frm_main.lv_waagen.Items[i].SubItems[2]+'
:@');
end;
FCS.Release;
Wobei diesesa andauernde Zugriff auf frm_main (und dann auch noch globale Variable
) sagen wir mal: potential zur Verbesserung bietet.
Wie kann man denn besser innerhalb des Threads auf Variablen / Daten des Hauptthreads (oder möglichweise auch anderen Threads) zugreifen?
Ich kenne bisher nur die Möglichkeit Daten an den Hauptthread mit Synchronize sicher zu übergeben.
Geht das mit Funktionen auch? Ich kenne das nur mit procedure.
Ab besten gar nicht, sondern man übergibt dem Thread die Informationen, die er zum Laufen braucht und der arbeitet das ab.
Ab besten gar nicht ist toll. Nur in meinem Fall nicht möglich. Er baut beim erzeugen eine
TCP-Verbindung auf, die während seiner Lebensdauer erhalten bleiben muss. Und in dieser muss er Daten über
TCP empfange und ans Hauptprogramm weiterleiten, bzw. dort proceduren Auslösen und umgekehrt auch Daten vom Hauptprogramm empfangen, die er dann über
TCP zu seinem Verbindungspartner weiterleitet.
Möglicherweise geht das nur über Messages.