AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Kein release in Finalization

Ein Thema von idefix2 · begonnen am 1. Jun 2017 · letzter Beitrag vom 1. Jun 2017
Antwort Antwort
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Kein release in Finalization

  Alt 1. Jun 2017, 14:26
ich habe jetzt seit einigen Tagen einen extrem hartnäckigen und lästigen Fehler erfolgreich eingegrenzt. Meines Erachtens handelt es sich um einen Fehler in der IDE.

Ich hatte implizit in mein Package eine Unit eingebunden, die in der initialization section ein Formular erstellt und dieses in der finalization section mittels release wieder freigibt.
Das Package lässt sich problemlos installieren, aber jeder Versuch, es zu deinstallieren, führt zu einem Totalabsturz der IDE.

Lange war ich der Meinung, es würde bei der Installation des Package crashen, und habe endlos danach gesucht, welche Veränderung des Source Codes meiner Komponenten zum Crash führt. Tatsächlich hat es mit den Komponenten des Package gar nichts zu tun, es crasht, wenn man bei installiertem Package irgend etwas (beliebiges) verändert, und das Package neu kompiliert, schon beim Versuch, das alte Package zu deinstallieren. Es wirkt sich derart aus, dass nur mehr Exception-Meldungen kommen, und man die IDE per Taskmanager killen und vor dem Neustart der IDE das BPL-File löschen muss.

Geändert von idefix2 ( 1. Jun 2017 um 14:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Kein release in Finalization

  Alt 1. Jun 2017, 14:55
Delphi-Quellcode:
procedure TCustomForm.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;
http://www.delphipraxis.net/80112-un...orm-close.html

Form.Release macht garnichts, außer der Form zu sagen, dass sie sich demnächst bitte freigeben soll.
Wenn die Form aber dazu kommt, ist das Package schon lange weg, die Methoden und RTTI dieser FormKlasse existieren nicht mehr
und wie soll diese Form-Instanz nun freigegeben werden, wenn ihr ganzes Inneres verschwunden ist?
Da muß es zwangsläufig knallen!

.Free


Forms sind global in der VCL registiert, also in deinem Fall der Form-Zeiger auf "Schrott"
und da die VCL immer mal wieder die globale Form-Liste durchläuft, knallt es immer wieder, wenn dieser Zeiger behandelt werden soll.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 1. Jun 2017 um 14:58 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: Kein release in Finalization

  Alt 1. Jun 2017, 15:57
Hols der Teufel!
release habe ich extra genommen, weil in der Dokumentation steht, dass man Gefahr läuft, dass es knallt, wenn man Formulare mit free statt mit release freigibt.
Aber in dem Fall ist es offensichtlich genau umgekehrt...

Danke jedenfalls für die Aufklärung.

P.S. Wenn diese Unit in ein normales Programm eingebunden war, hat das release beim Schliessen des Programms immer normal funktioniert.

Geändert von idefix2 ( 1. Jun 2017 um 15:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Kein release in Finalization

  Alt 1. Jun 2017, 16:06
P.S. Wenn diese Unit in ein normales Programm eingebunden war, hat das release beim Schliessen des Programms immer normal funktioniert.
Jupp, da blieb ja der Code/RTTI erhalten und im selben Zug wurde auch die ganze VCL beendet, bevor die Unit/EXE aus dem Speicher verschwand.


Release statt Free, wenn nach dem Release/Free noch auf die Form zugegriffen werden konnte.
Drum heißt es auch oft, dass man die Form nicht innerhalb der eigenen Methoden freigeben soll, was aber auch Funktioniert, so lange danach nicht auf die Form zugegriffen wird.

Beispiel:
in TButton.OnClick den Button selber freigeben -> geht
in TcxButton.OnClick (DevExpress) den Button selber freigeben > knallt, da DevExpress selber nochmal auf die Buttoninstanz, also auf Self, zugreift (mit einem beherzten Delphi-Referenz durchsuchenAbort wird das umgangen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu ( 1. Jun 2017 um 16:09 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf