AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Aufräumarbeiten bei Anwendungsende
Thema durchsuchen
Ansicht
Themen-Optionen

Aufräumarbeiten bei Anwendungsende

Ein Thema von Der schöne Günther · begonnen am 30. Aug 2018 · letzter Beitrag vom 3. Sep 2018
Antwort Antwort
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Aufräumarbeiten bei Anwendungsende

  Alt 30. Aug 2018, 14:24
Danke für die Antworten bislang!

Beim Destroy einer Klasse weiß ich in der Regel nicht, ob lediglich die Instanz freigegeben wird oder das Programm beendet. Ebensowenig weiß ich, was um mich herum gerade passiert.
Absolut, das kann man nicht wissen, das ein Destruktor in der Regel alles aufräumen sollte was man aufgebaut hast stellt sicher niemand in Frage ��


Nu ja, da geht es um DLLs
In der Überschrift schon, aber das lässt sich auch übertragen. So zum Beispiel in dem anderen Artikel.

Der nächste Entwickler nach Dir räumt auf (schließt z.B. irgend welche Handles) und ist am Ende irritiert, dass sein Code nicht ausgeführt wird, weil ein Schlaumeier vor ihm irgendwo ein ExitProcess eingebaut hat.
Ja, aber wenn die Anwendung endet, dann endet sie halt. Sein Coe würde auch nicht ausgeführt bei Stromausfall oder wenn die Anwendung abstürzt. Das Betriebssystem kümmert sich nach Prozess-Ende schon selbst darum dass Dateien, Handles usw. ordentlich geschlossen werden.


In einer anderen Anwendung tun wir genau das: WENN Sie endet:
  1. Stelle Sicher dass alle kritischen Dinge (Ausgänge, Motoren, ...) im sicheren Zustand sind
  2. Schreibe Einstellungen auf die Platte
  3. Schreibe in Log-Datei dass die Anwendung nun zu Ende ist
  4. Andwendung endet

Dieser Teil muss natürlich gemacht werden und ist ganz spezifisch für die einzelne Anwendung. Ich fand das ziemlich sinnvoll.


Im konkreten Fall weiß ich auch was so lange braucht. Es wäre ein irrsinniger Aufwand das so umzubauen dass es sich jederzeit abbrechen ließe. Und es macht, wie der gute Raymond sagt, auch keine Sinn. Niemand interessiert sich mehr für das Ergebnis.

Geändert von Der schöne Günther (30. Aug 2018 um 14:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Aufräumarbeiten bei Anwendungsende

  Alt 30. Aug 2018, 15:29
Es gibt guten einen Grund, um immer aufzuräumen.

Wenn du am Ende noch einen Speicherlecktest ausführen willst.
Das geht ja nur, wenn auch vorher alles aufgeräumt wurde, denn nur dann siehst du auch, was davon wirklich die Lecks sind. (alles, was dann noch da ist, und was nicht "absichtlich" unfreigegeben blieb Delphi-Referenz durchsuchenSystem.RegisterExpectedMemoryLeak)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Aufräumarbeiten bei Anwendungsende

  Alt 30. Aug 2018, 15:37
Halte es auch für guten Stil am Ende aufzuräumen. In der Regel passiert das doch eh "automatisch", wenn die letzte Klasse freigegeben wurde. Sollte es zumindest, wenn die Klassen selbst im Destructor für Ordnung sorgen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Aufräumarbeiten bei Anwendungsende

  Alt 30. Aug 2018, 17:05
Vielleicht beeindruckt mich auch nur Raymond Chens anschauliches Beispiel so sehr. Ich meine, er hat ja nicht Unrecht. Welchen Sinn macht es, akribisch jedes Byte freizugeben wenn die Anwendung sowieso nicht mehr gebraucht wird?

Speicherleck-Tests sind ein guter Grund, aber das versuche ich mittlerweile eher über die Unit-Tests zu machen.


Dass die Anwendung am Schluss freundlich alle Verbindungen zumacht und Tschüss sagt, da hat der Benutzer auch nichts von (außer Wartezeit). Hmm…


Ich hätte erwartet mehr Zuspruch zu bekommen 🤔
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Aufräumarbeiten bei Anwendungsende

  Alt 30. Aug 2018, 17:16
Ich hätte erwartet mehr Zuspruch zu bekommen 🤔
Ich vermute mal, daß das Problem mit der Wartezeit vielleicht nicht so weit verbreitet ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
446 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Aufräumarbeiten bei Anwendungsende

  Alt 31. Aug 2018, 09:37
Ich kann mich dem nur Anschließen, mit übermäßiger Wartezeit beim Programmende hatte ich nur selten zu kämpfen. Mit Programmen die am Ende Daten leaken habe ich aber noch nie positive Erfahrungen gemacht (allein deshalb ist meiner Meinung nach, beim Programmende alles korrekt freizugeben).

Ob sich bei einem Stromausfall oder Crash das Betriebssystem nun wirklich um alles kümmert spielt daher für mich kaum eine Rolle und aus meiner Erfahrung würde ich sage: "Mal so mal so"
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.680 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Aufräumarbeiten bei Anwendungsende

  Alt 31. Aug 2018, 12:57
Vielleicht lässt sich der Speicherbereich, der hier anscheinend so viel Zeit in Anspruch nimmt, um bereinigt zu werden, anders organisieren??? Da müsste man nur wissen worum es geht?
Sven Harazim
--
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Aufräumarbeiten bei Anwendungsende

  Alt 3. Sep 2018, 09:47
Beim Destroy einer Klasse weiß ich in der Regel nicht, ob lediglich die Instanz freigegeben wird oder das Programm beendet. Ebensowenig weiß ich, was um mich herum gerade passiert.
Absolut, das kann man nicht wissen, das ein Destruktor in der Regel alles aufräumen sollte was man aufgebaut hast stellt sicher niemand in Frage ��
Nicht? Genau so habe ich Raymond aber verstanden.

Vielleicht beeindruckt mich auch nur Raymond Chens anschauliches Beispiel so sehr. Ich meine, er hat ja nicht Unrecht. Welchen Sinn macht es, akribisch jedes Byte freizugeben wenn die Anwendung sowieso nicht mehr gebraucht wird?
Ja, es macht keinen Sinn alles freizugeben, wenn die Anwendung sowieso nicht mehr gebraucht wird. Aber: eben nur wenn. Wie Uwe schon schrieb, kann die Klassen das nicht (ohne weiteres) wissen ob das "wenn" nun eintritt.
Oder willst Du ein globales Flag Shutdown: Boolean einführen und in jedem destructor prüfen ob das gesetzt ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Aufräumarbeiten bei Anwendungsende

  Alt 3. Sep 2018, 11:13
Oder willst Du ein globales Flag Shutdown: Boolean einführen und in jedem destructor prüfen ob das gesetzt ist?
Gibt es schon: Application.Terminated Aber so direkt in Komponenten sollte man es dann doch nicht verwenden, denn
* in einer Service-Anwendung kommt "Application" nicht aus der Unit Forms, sondern aus SvcMgr
* im FMX ist es FMX.Forms statt VCL.Forms
* In einem Thread wäre es Self.Terminated , falls der Thread in der RTL gekapselt wäre,
und außerhalb der Threadklasse könnte man auf die Idee kommen TThread.CurrentThread.Terminated zu nehmen, was aber nicht funktioniert, da CurrentThread eine "eigene" Klasseninstanz nutzt und der Terminated-Flag nicht durchgereicht wird.
* ...
und für eine Komponente/Unit ist beim Kompilieren aber nicht ersichtlich, wo sie verwendet wird.
Ein Therapeut entspricht 1024 Gigapeut.
  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 07:12 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