AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beispiel / Example TThread.CreateAnonymousThread

Ein Thema von ScharfeMietze · begonnen am 18. Mai 2016 · letzter Beitrag vom 18. Mai 2016
Antwort Antwort
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#1

Beispiel / Example TThread.CreateAnonymousThread

  Alt 18. Mai 2016, 16:42
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

Geändert von ScharfeMietze (18. Mai 2016 um 17:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik
Online

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

AW: Beispiel / Example TThread.CreateAnonymousThread

  Alt 18. Mai 2016, 17: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 18:13 Uhr)
  Mit Zitat antworten Zitat
ScharfeMietze

Registriert seit: 5. Mär 2014
165 Beiträge
 
Delphi 10.2 Tokyo Architect
 
#3

AW: Beispiel / Example TThread.CreateAnonymousThread

  Alt 18. Mai 2016, 18:27
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

Geändert von ScharfeMietze (18. Mai 2016 um 18:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 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