Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Anwendung sauber beenden - FormDestroy wird nicht aufgerufen (https://www.delphipraxis.net/179843-anwendung-sauber-beenden-formdestroy-wird-nicht-aufgerufen.html)

Alex_ITA01 5. Apr 2014 21:57

Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Hallo Delphianer,
ich versuche mal mein Problem zu beschreiben.

Ich habe ein relativ großes Projekt von Delphi 2006 nach XE4 portiert.
Hat auch alles soweit geklappt nur eine Sache funktioniert nicht sauber.
Nämlich das Anwendung beenden.
Beim Runterfahren der Anwendung (FormClose) wird eine Prozedure aufgerufen, welche alle Threads und Speicherobjekte freigeben soll. Diese Funktion kehrt auch erst wieder (also FormClose läuft erst dann zum Ende) wenn alle Sachen freigegeben wurden. Jetzt kommt folgendes Problem:
Ich habe FormClose mit verschiedenen Action-Rückgaben (caFree,caHide) versucht zu beenden nur leider wird FormDestroy nicht mehr aufgerufen bzw. kommt er da nie rein.
Die Anwendung scheint also irgendwo zu hängen aber ich weiß nicht wo. Laut Delphi wird sie auch noch ausgeführt, im TaskManager werden auch noch 5 Threads angezeigt obwohl ich mir relativ sicher bin, alle beendet zu haben.
Wie kann ich also herausfinden, warum FormDestroy nicht aufgerufen wird (hier werden nämlich noch Komponenten und andere Sachen die in meinem MainForm liegen freigegeben) und welche Threads evtl. noch laufen (gibt es eine Möglichkeit die ThreadNamen herauszufinden, damit man da weiter suchen kann?).

Ich hoffe ihr könnt mir hier weiterhelfen.
Leider ist die Anwendung viel zu groß, um diese hier darzustellen. Deswegen hoffe ich auf eure Erfahrung, mit dem Problem weiter zu kommen.

Grüße

Luckie 5. Apr 2014 22:10

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Wie beendest du die Threads? Kann es zu einem Deadlock kommen?

Alex_ITA01 5. Apr 2014 22:16

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Ich schicke an alle Threads ein Terminate per Message und wenn diese mir das zurückmelden (wird im Terminate eine variable gesetzt), dann erkenne ich damit, dass dieser beendet ist. FreeOnTerminate ist False bei allen und wenn die dann eben beendet sind, mache ich noch ein FreeAndNil des Threads.

Sir Rufo 5. Apr 2014 22:18

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Das Abräumen gehört aber nicht in FormClose sondern in den Destructor oder in BeforeDestruction.

Anyway, bestimmt versuchst du irgendwo einen Thread freizugeben aber der Thread beendet sich nicht und somit bleibt das dort eben hängen. (Im Destroy von einem Thread wird automatisch Terminate aufgerufen und auf die Beedigung des Threads gewartet)

Überprüfe also deine Threads, ob die sich wirklich alle bei Terminated sich auch Beenden und dass du keine Deadlocks dort produzierst.

Alex_ITA01 5. Apr 2014 22:23

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Wenn der Thread sich nicht beenden würde, dann würde ich aus meiner Procedure ja nicht raus kommen die auf die Beendigung der Threads wartet. Ich schicke ja wie gesagt erst das Terminate per Message an jeden Thread, da diese beim Beenden evtl. noch irgendwelche letzten Aufgaben erledigen müssen. Sobald sie dann die empfangene Message in der Queue empfangen (WM_Terminate), rufe ich Terminate auf (dieses ist bei allen Threads überschrieben und setzt eben die Variable, welche abgefragt werden kann). Sobald dann diese Variablen alle gesetzt sind, rufe ich FreeAndNil der ganzen Threads auf, welchen ich auch das WM_Terminate geschickt habe.

Gibt es denn eine Möglichkeit herauszufinden, welche Threads noch laufen? Namen evtl.?

Grüße

Alex_ITA01 8. Apr 2014 11:01

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
 
Hallo,
wollte nur Bescheid sagen, dass ich mir die Debug-DCUs angemacht habe und dann nach dem FormClose weiter durchdebuggt habe was passiert in den Delphi-Units.
Problem war, dass danach ein anderes Formular des Projektes freigegeben wurde und da war im FormDestroy noch ein ungeschützter Zugriff auf ein ThreadObjekt, welches ja vorher im FormClose vom MainForm bereits freigegeben wurde.

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 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