Ich habe es nun selbst herausgefunden. TThread.Queue() ist die Lösung
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure ()
begin
for var i: integer := 0 to 1000 do
begin
TThread.Queue(nil, procedure
begin
lblOutput.Text := i.ToString; // problematische Ausgabe
end);
end;
TThread.Synchronize(TThread.CurrentThread, procedure ()
begin
lblOutput.Text := 'Finished';
end);
end).Start;
end;