Ich habe ein Programm, das einen Thread verwendet, der einige Arbeit ausführt. Der Thread sollte einen anderen Thread (in diesem Beispiel den Hauptthread) über den Fortschritt informieren. Wenn ich Synchronize() verwenden, um die Synchronisierung durchzuführen, funktioniert alles wie erwartet. Wenn ich mit dem Haupt-Thread zu synchronisieren und die für variable veröffentlichen und es in eine Liste bekommt jeder Wert richtig in meine ListBox gedruckt setzen:Behandlung der lokalen Variablen in anonymer Prozedur an TThread.Queue übergeben
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Synchronize(
procedure()
begin
FireEvent(i);
end);
end;
end;
Ausgang: 1, 2, 3, 4, 5. .. 1000
Wenn ich Queue(), um die Synchronisation der Ausgang wie auszuführen nicht zu erwarten:
procedure TWorkerThread.Execute;
var
i: Integer;
begin
inherited;
for i := 1 to 1000 do
begin
Queue(
procedure()
begin
FireEvent(i);
end);
end;
end;
Ausgang: 200, 339, 562, 934, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, 1001, [...]
Was geschieht hier? Nach meinem Verständnis sollte das anonyme Verfahren die Variable "i" erfassen?
PS: Ich weiß, dass es nicht viel Sinn macht, die Benutzeroberfläche so häufig zu aktualisieren. Ich möchte nur wissen, was den variablen Inhalt ändert, obwohl die Anonymous-Methode den Wert erfassen sollte. –
Sie erfassen die Variable. Aber Sie versuchen, den "Wert" zu erfassen. Sie müssen also für jede Iteration der Schleife eine neue Variable erstellen und diese erfassen. Dies erfordert einen neuen Stapelrahmen und somit einen Funktionsaufruf. Was zu dem Code in LURDs Antwort führt. –