Einzelnen Beitrag anzeigen

Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Beispiel / Example TThread.CreateAnonymousThread

  Alt 18. Mai 2016, 16:17
Delphi-Quellcode:
procedure TForm1.SetThreadResultList(ResultList: TStringList);
begin
  FThreadResult.Add(ResultList.text);
  mmo1.Lines.Add('---ResultList.Text---' + TimeToStr(Now));
  mmo1.Lines.Add(ResultList.Text);
  mmo1.Lines.Add('---ResultList.Text Ende---'+ TimeToStr(Now));
end;

Naja da du den Add vom Memo sofort hinter einander machst, ist da nur die Zeitdifferenz für das Add des Textes. Wofür?


Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  LSource,LDestination: string;
begin
LSource:='D:\Test';
Ldestination:= 'C:\Test';

// Anfang des Threads

  TThread.CreateAnonymousThread(procedure ()
  var
   LResultlist: TStringList;
  begin

    LResultList := TStringList.Create;
    try
    LResultList.Add('ThreadStart' + TimeToStr(Now)) ;
    Tdirectory.Copy(LSource,LDestination); // hier kann LSource und LDestination eingesetzt werden obwohl diese außerhalb des Threads gesetzt wurden.

      TThread.Synchronize (TThread.CurrentThread, // nachdem Copy beendet ist geht es hier weiter.
        procedure ()
        begin
         LResultList.Add('ThreadEnd' + TimeToStr(Now)) ;
        SetThreadResultList(LResultList);
        end);
    finally
      LResultList.Free;
    end;
  end).Start;
// Hier ist das Ende des anonymen Threads
end;
Wofür die StringList?

Vielleicht auch noch verhindern, dass der Button mehrfach geklickt wird?

Wie wäre es mit:

Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  LSource,LDestination: string;
begin
  Btn1.Enabled := false;
  LSource:='D:\Test';
  Ldestination:= 'C:\Test';

  TTask.Run(procedure
  begin
    try
    TThread.Queue(NIL,Procedure
      begin
        mmo1.Lines.Add('ThreadStart' + TimeToStr(Now));
      end);
    try
      Tdirectory.Copy(LSource,LDestination);
    except
      TThread.Queue(NIL,Procedure
        begin
          mmo1.Lines.Add('Fehler (XY)' + TimeToStr(Now)); // ggf. noch den Fehler mit ausgeben?
        end);
    end;

    TThread.Queue(NIL,Procedure
      begin
        mmo1.Lines.Add('ThreadEnde' + TimeToStr(Now));
        btn1.Enabled := true;
      end);
  end);
end;

Geändert von Mavarik (18. Mai 2016 um 17:13 Uhr)
  Mit Zitat antworten Zitat