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;