AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Anwendung sauber beenden - FormDestroy wird nicht aufgerufen
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

Ein Thema von Alex_ITA01 · begonnen am 5. Apr 2014 · letzter Beitrag vom 8. Apr 2014
Antwort Antwort
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 5. Apr 2014, 21:57
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 5. Apr 2014, 22:10
Wie beendest du die Threads? Kann es zu einem Deadlock kommen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#3

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 5. Apr 2014, 22:16
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.
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 5. Apr 2014, 22:18
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#5

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 5. Apr 2014, 22:23
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#6

AW: Anwendung sauber beenden - FormDestroy wird nicht aufgerufen

  Alt 8. Apr 2014, 11:01
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
Let's fetz sprach der Frosch und sprang in den Mixer
  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 01:32 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