Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Beispiel / Example TThread.CreateAnonymousThread (https://www.delphipraxis.net/189218-beispiel-example-tthread-createanonymousthread.html)

ScharfeMietze 18. Mai 2016 15:42

Beispiel / Example TThread.CreateAnonymousThread
 
Ich hoffe es ist hier erwünscht.
Nachdem ich mich persönlich immer geärgert habe wenn Formen nicht ansprechbar waren und Threads zu schreiben (für mich) nicht gerade schnell und einfach ist, habe ich nun eine relativ simple Methode gefunden.

Falls ich damit nicht alleine bin, hier mal ein Stück Code der recht einfach aufgebaut ist und unter Seatle entstanden ist.


Ein Memo und eine private StringList um das Ergebnis zu zeigen.

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;
Und hier der Code um einfach per Thread einen Testordner zu kopieren.

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;
Ich hoffe das der Code aufstrebenden Beginnern etwas helfen kann.

Gruß
SM:)

Mavarik 18. Mai 2016 16:17

AW: Beispiel / Example TThread.CreateAnonymousThread
 
Zitat:

Zitat von ScharfeMietze (Beitrag 1338391)
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?


Zitat:

Zitat von ScharfeMietze (Beitrag 1338391)
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;

ScharfeMietze 18. Mai 2016 17:27

AW: Beispiel / Example TThread.CreateAnonymousThread
 
Natürlich ist das noch (weit) ausbaufähiger. Aber wenn man den Code laufen lässt denke ich zeigt es ganz schön wann es was tut. Wie er mit der Form agiert.
Ich Tat mich bis vor kurzem immer schwer mit Threads und deren Verwaltung.
Die Liste ist daher auch nur zur "Demo"

Ja das mit der .Quenue ist auch eine feine Sache :)
schön das es hier mit steht :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz