Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#4

AW: TTask & Synchronize Verständnisproblem

  Alt 19. Apr 2017, 12:04
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat