Und spätestens hier sollte man anhand der Lesbarkeit sehen dass es besser wäre das Herunterladen und das Anzeigen in der Oberfläche zu trennen. Auf Dauer bleibt es bestimmt nicht bei einem einfachen Memo1.Lines.Add(..)
...
Vielleicht dann besser gleich so?
Dazu kommt noch, daß das Synchronize eh die letzte Aktion der Task ist und somit auch durch ein Queue ersetzt werden kann.
Delphi-Quellcode:
function CreateMyTask(I: Integer; fn: string; HandleResult: TProc<Integer, string, Boolean>): TProc;
begin
result :=
procedure ()
var
ok: Boolean;
begin
ok := DownloadFile(fn); // Herunterladen - zeitintensiv
TThread.Queue(nil,
procedure
begin
HandleResult(i, fn, ok);
end);
end;
end;
function CreateResultHandler(Target: TStrings): TProc<Integer, string, Boolean>;
begin
Result :=
procedure (Idx: Integer; FileName: string; OK: Boolean)
var
ss: string;
begin
if OK then begin
ss := FileName + ' wurde heruntergeladen.';
end
else begin
ss := FileName + ' wurde nicht heruntergeladen.';
end;
Target.Add(ss);
end;
end;
...
SetLength(tasks, anz);
for i := 0 to anz - 1 do
begin
fn := Files[i].Filename;
s := fn + ' wird heruntergeladen...';
line := Memo1.Lines.Add(s);
Files[i].Zeilennummer := line;
tasks[i] := TTask.Create(CreateMyTask(i, fn, CreateResultHandler(Memo1.Lines)));
tasks[i].Start;
end;