Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi FastMM4 und Beenden der Application (https://www.delphipraxis.net/172902-fastmm4-und-beenden-der-application.html)

AJ_Oldendorf 28. Jan 2013 12:18

FastMM4 und Beenden der Application
 
Hallo,
ich nutze FastMM(499).
Allerdings habe ich eine Frage zu dem Report, der am Ende der Anwendung angezeigt wird.
In der Anwendung werden relativ viele Threads erstellt, die beim Beenden der Anwendung terminiert werden. Das geschieht über Windows Messages, welche die Threads dann abfragen und sich selber terminieren. Funktioniert auch soweit nur habe ich festgestellt, dass ich an die ganzen Threads die Terminierung absende, dann aber kurze Zeit später der Report von FastMM auftaucht mit gefundenen Speicherlecks und dann auf einmal Delphi in den Breakpoint für das abfangen der Terminierungsmessage rein kommt. Die Application läuft also noch und die Threads bekommen die Nachricht zum beenden. Nur zeigt mir FastMM leider zu früh die Speicherlecks an, welche aber definitiv keine sind. Die Threads beenden sich ja, nur FastMM wartet nicht lang genug ab, bis die Application wird beendet ist. Kennt dieses Verhalten jemand oder kann mir ein Tip geben?

Grüße

CCRDude 28. Jan 2013 13:12

AW: FastMM4 und Beenden der Application
 
Wartet Deine Anwendung denn beim Beenden auf diese Threads, oder geht sie einfach davon aus, dass diese die Info schnell genug bekommen?

Eigentlich ist FastMM da ein gutes Indiz für Fehler eben dies betreffend, denn FastMM springt ja nicht von selbst an, sondern afaik (kann von hier nicht nachsehen) per finalization-Abschnitt der FastMM-Unit.

AJ_Oldendorf 28. Jan 2013 13:19

AW: FastMM4 und Beenden der Application
 
Eigentlich wartet die Anwendung darauf...
Ich kann ja sogar noch weiter debuggen mit F8 / F7 wenn bereits das Report-Fenster von FastMM offen ist. Das könnte ich ja nicht, wenn die Application wirklich beendet wäre oder?

Grüße

CCRDude 28. Jan 2013 14:35

AW: FastMM4 und Beenden der Application
 
Jain... wenn ich recht haben sollte (wie gesagt aktuell nur nach Erinnerung) wird das Fenster vom finalization-Abschnitt der Unit FastMM aufgerufen. Natürlich kann an der Stelle noch debugged werden, den die Message-Box "unterbricht" dern Hauptthread ja nur, bis der Benutzer den Dialog wegklickt... sowohl der Main-Thread nach dieser Stelle (wenn Unit-Reihenfolge inkorrekt z.B. die finalization-Parts anderer Units, und natürlich FastMM-finalization selber) als auch "beliebig" in noch laufenden Threads. Das Fenster ist ja noch Teil des Programmes, wenn auch ein Teil, der möglichst am Ende kommen sollte (es sei denn, der User hat parallele Threads, die länger als der Hauptthread laufen, oder bei der Reihenfolge der Units etwas durcheinandergebracht).

sx2008 28. Jan 2013 19:38

AW: FastMM4 und Beenden der Application
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1200964)
In der Anwendung werden relativ viele Threads erstellt, die beim Beenden der Anwendung terminiert werden. Das geschieht über Windows Messages, welche die Threads dann abfragen und sich selber terminieren

Eigentlich müsste deine Anwendung alle laufenden Thread in einer Liste speichern.
Beim Programmende wird dann von jedem Thread die Methode
Delphi-Quellcode:
Terminate
aufgeraufen.
(Windows Messages würde ich für diesen Zweck nicht verwenden)
Die Threads fragen periodisch das
Delphi-Quellcode:
property Terminated
ab und beenden sich selber.
Da es einige Zeit dauern kann bis alle Threads reagiert haben sollte der Hauptthread bis zu 3s warten.
Dauert es länger, sollte der Hauptthread weiterlaufen und sich beenden.
Die hängenden Threads werden dann von Windows gewaltsam beendet; was dann natürlich zu Speicher-/Resourcenlecks führt, die aber ebenfalls von Windows entsorgt werden.

lbccaleb 28. Jan 2013 20:23

AW: FastMM4 und Beenden der Application
 
Hast du die Unit FastMM vor allen anderen eingefügt?
Das heißt nicht vor allen anderen Units der MainForm, sondern vor allen anderen Units des Hauptquellcodes (Menü/Project/View Source)!

Dann mach FastMM auch keine Fehler.
Und das die Threads nen Speicherleck sind, muss nicht sein, nur in dem Moment halt, wo FastMM anschlägt sind Sie das. Und so wie du sagst entfernst du die Instanzen ja erst beim Beenden des Programms. Auf gut Deutsch, die Threads sind Speicherlecks auch dann, wenn vor dem Beenden des Programm nen ganz anderer Fehler für den Absturz des Programms sorgt, denn genau dann werden Sie ja nicht mehr entfernt.

Ohne jetzt den Quelltext zu sehen kann man aber keine genaueren Angaben machen.

AJ_Oldendorf 29. Jan 2013 13:10

AW: FastMM4 und Beenden der Application
 
Hallo,
ja habe die Unit ganz oben eingefügt.
Ich bin auch schon bisschen weiter gekommen, stehe aber vor einem neuen Problem. Dies kommt aber in einem neuen Thread.

Gruß


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