AGB  ·  Datenschutz  ·  Impressum  







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

Freigabe Thread

Ein Thema von AJ_Oldendorf · begonnen am 12. Feb 2021 · letzter Beitrag vom 16. Feb 2021
 
Benutzerbild von Mavarik
Mavarik

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

AW: Freigabe Thread

  Alt 16. Feb 2021, 16:45
Das Beispiel von Mavarik sieht mehr irgendwie zu "viel" aus. Da ist der einfache Thread mit seinem Create/Destroy und Execute für mich übersichtlicher, sicherlich aber Ansichtssache.
Naja mehr als ein Thread Create/Destroy ist das ja auch nicht - eigentlich noch viel zu einfach für den Hausgebrauch!

Zitat:
Das Beispiel von Mavarik sieht mehr irgendwie zu "viel" aus.
Für den normalen Hausgebrauch definitiv viel zu viel. Da kann man quasi alles von wegschmeißen.
Naja, eigentlich kann man davon NIX wegschmeißen. Das ist einfach ein super simple Methode um eine Benachrichtigung
zu erhalten, wenn der Thread fertig ist.

Normalerweise mache ich das noch aufwendiger!

Folgendes Beispiel:

In einem Form soll eine Aufgabe im Hintergrund ausgeführt werden...

Klar kann man das als "Schön-Wetter-Code" schreiben mit:

Delphi-Quellcode:
Procedure TForm1.Button1OnClick(Sender : TObject);
begin
  Button1.Enabled := false;
 
  TTask.Run(Procedure
    begin
      Sleep(5000); // of was richtiges.
      TThread.Queue(Nil,Procedure
        begin
          Edit1.Text := 'Thread ist fertig und hat: 42 ermittelt');
          Button1.Enabled := true;
        end);
    end);
end;
1. Was ist, wenn der Sleep eine Abfrage auf einen WebServer ist, der nicht wiederkommt oder ein Timeout hat von 5 Min.
2. Was ist, wenn das eine lange SQL-Abfrage ist die einfach ewig dauert?

Problem - der Button, geht nicht wieder auf Enabled... Toll..
Was aber wenn der User das Fester bereits wieder geschlossen hat?

Peng Exeption und die fängt auch erstmal keine ab... Man kann natürlich da noch ein try except drum setzen...

OK - Dann das Beispiel mit einem eigenen TThread...
Was ist wenn der Thread im Execute etwas aufruft, das nicht wieder kommt und damit steht?
Richtig, ein TThread.Destroy signalisiert Terminate aber das wir leider nicht ausgeführt.
Wenn also das Thread im FormOnDestroy oder wo auch immer freigegeben werden soll, bleibt das Fenster offen und die Anwendung steht.

Ich brauche also wenigstens ein Handle, das OutOfScope geht, wenn ich das Form schließe. Das OutOfScope darf nicht versuchen den Thread frei zu geben, sonst steht die Anwendung wieder.
Ich nehme das "nur" als signal, um den OnFinish-Class back mitzuteilen, dass er nicht mehr aufs Form zugreifen darf.

Und der Thread? - Naja, der lebt als tote Instance solange, bis die Routine im Execute mal zurück kommt oder das Programm beendet wird.
Das kann ich auch 10x versuchen... Die wenigen bytes stören mich nicht. Leider gibt es - außer mit einem OutOfProcess Server keine andere Möglichkeit den Thread zu zerstören.
Aber ein OutOfProcess Thread wäre dann hierfür vielleicht doch etwas "zu viel"...


Mavarik
  Mit Zitat antworten Zitat
 


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 03:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz