AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.
Thema durchsuchen
Ansicht
Themen-Optionen

Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

Ein Thema von bernau · begonnen am 17. Mär 2025 · letzter Beitrag vom 17. Mär 2025
Antwort Antwort
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#1

Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 13:21
Ich habe ein Objekt, welches Daten aus dem Internet laden soll und dann kalkulieren soll.

Kann aber sein, dass das Objekt nicht mehr benötigt wird, bevor die Kalkulation beendet wurde. Wie kann das Objekt in seinem Destroy den Task beenden?

Hier mal ein Codebeispiel:

Delphi-Quellcode:
type

  TComplexDataRec = record
    // ManyItemsToCalculate
    dataAvailable:Boolean;
  end;

  TDataObject = class(TObject)
  public
    fcalculatedComplexData: TComplexDataRec;

    procedure LoadAndCalculate;

    constructor Create;
    destructor Destroy;override;
  end;

implementation

{ TDataObject }

constructor TDataObject.Create;
begin

end;

destructor TDataObject.Destroy;
begin
  // Instanz wird nicht mehr gebraucht und soll freigegeben werden.
  // Aber der Task, welcher mit LoadAndCalculate gestartet wurde
  // kann eventurell noch laufen.

  // Eigentlich darf ich diese Instanz nicht freigeben, solange der Task noch läuft, da dieser
  // ja auf die Variable fcalculatedComplexData zugreifen wird.

  // Wie beende ich den Task und stelle sicher, dass das zweite TThread.Synchronize noch
  // abgearbeitet wird.
  inherited
end;

procedure TDataObject.LoadAndCalculate;
var
  lComplexDataToCalc: TComplexDataRec;
begin
  TTask.run(
    procedure
    begin
      TThread.Synchronize(nil,
        procedure
        begin
          //************************************************************************
          // Hier mit einem NotifyEvent in eine Liste der aktiven Treads eintragen.
          //************************************************************************

          fcalculatedComplexData.dataAvailable := False;
        end);

        // hier Daten aus dem Internet laden und die complexe Berechnung durchführen
        // und in lComplexDataToCalc speichern

      TThread.Synchronize(nil,
        procedure
        begin
          fcalculatedComplexData:=lComplexDataToCalc;
          fcalculatedComplexData.dataAvailable := True;

          //************************************************************************
          // Hier mit einem NotifyEvent aus der Liste der aktiven Treads austragen.
          //************************************************************************
        end);
    end);
end;
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#2

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 13:31
Über diese bzw. eine ähnliche Problematik habe ich mal was geschrieben: Async Tasks in VCL Projects. Vielleicht passt das ja für deinen Fall.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.328 Beiträge
 
Delphi 12 Athens
 
#3

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 13:43
im DoTerminate/OnTerminate,
aber am Einfachsten als Try-Except in der Execute-Methode,

bzw., wenn du eh ein eigenes DatenObjekt hast, dann das doch einfach als Interface (referenzgezählt).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.305 Beiträge
 
Delphi 12 Athens
 
#4

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 14:03
Danke ihr beiden.

Das mit dem Interface ist ja mal ne Idee
Manchmal kann die Lösung so einfach sein.


<Insider>Frank (Mavarik), das wird bestimmt Gesprächsthema beim nächsten Delphifrühstück </Insider>
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 14:25
Danke ihr beiden.

Das mit dem Interface ist ja mal ne Idee
Manchmal kann die Lösung so einfach sein.


<Insider>Frank (Mavarik), das wird bestimmt Gesprächsthema beim nächsten Delphifrühstück </Insider>
Ich war nicht schnell genug... <Insider>Natürlich</Insider>

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.328 Beiträge
 
Delphi 12 Athens
 
#6

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 14:55
<Outsider> Frank (der Andere) war schneller </Outsider>
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.869 Beiträge
 
Delphi 12 Athens
 
#7

AW: Object mit einem laufenden Thread freigeben. Wie Thread im Destroy beenden.

  Alt 17. Mär 2025, 15:37
Tatsächlich habe ich das auch mit Interfaces gelöst. Konkret habe ich einen Handler dafür an unseren Basisformular-Typ angetackert, so dass man dann in dem Interface prüfen kann, ob das Fenster noch vorhanden, noch sichtbar usw. ist. So kann man nicht nur darin die anonyme Methode unterbringen, die nach dem Ende des Threads im Formular arbeitet, sondern man kann darin auch prüfen, ob das Ergebnis noch angezeigt werden muss usw., falls das nicht mehr nötig ist, wenn das Fenster nicht mehr sichtbar ist.

Das ganze noch mit Generics verfeinert gab eine echt schöne Lösung.
Sebastian Jänicke
AppCentral
  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 18:52 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 by Thomas Breitkreuz