Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Speicher freigeben (https://www.delphipraxis.net/124726-speicher-freigeben.html)

texmurphy901 24. Nov 2008 10:55


Speicher freigeben
 
Hallo allerseits,

habe da ein kleines Problem: Ich lasse mir in meinem Programm zur Laufzeit PDF-Dokumente anzeigen. Dazu habe ich mir die Komponente von Gnostice gekauft, das aber nur am Rande.
Jedenfalls habe ich ein (fast) leeres Fenster, welches erst bei Bedarf zur Laufzeit die PDF-Komponenten erzeugt und die Datei anzeigt. Beim schließen des Fensters, gebe ich die Instanzen wieder frei. Dummerweise schlägt sich das nicht im Speicherverbauch meiner Anwendung nieder. Wenn ich mit dem Task manager kontrolliere, so steigt der Speicher mit jedem Aufruf des Fensters an, wird aber beim schließen nicht wieder kleiner.
Da es sich nicht gerade um kleine Mengen handelt (>500KByte) ist also irgendwann Sense auf kleineren Rechnern und das wollte ich gerade mit dem freigeben der Ressourcen ja verhindern.


Hat jemand eine Idee?

Hier nun ein paar Code-Schnippsel:


Erzeugen der Instanzen. Das geschieht in einer eigenen Prozedur __init, die explizit gestartet werden muss, die aber nicht automatisch bei onCreate oder onShow aufgerufen wird. Damit bin ich mir sicher, dass ich nicht nebenbei noch ein paar andere Instanzen erzeuge. Hier der Code:
Delphi-Quellcode:
  procedure Tviewer.__init;
begin
  //Fenstergröße einstellen
  width:=800;
  height:=780;
  PDFViewer:=TgtPDFViewer.Create(self);
  with pdfviewer do begin
    Parent:=Viewer;
    Width:=750;
    Height:=700;
    Top:=50;
  end;

  PDFDoc:=tgtPDFDocument.Create(self);

  pdfviewer.PDFDocument := PDFDoc;
end;
...und die Ressourcenfreigabe bei onClose des Form:
Delphi-Quellcode:
procedure Tviewer.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   PDFDoc.free;
   PDFViewer.free;
end;
Ein Ersetzen von Free durch Destroy hilf nebenbei gesagt auch nicht, falls jemand mit dem Tip kommen sollte :)
Ich danke schonmal allen Helfenden!!!

Sherlock 24. Nov 2008 11:00

Re: Speicher freigeben
 
Wird denn der Speicher freigegeben, wenn die Anwendung komplett geschlossen wird?
In dem Fall würde ich die einmal erzeugte PDF-Komponente nicht wieder freigeben, sondern wieder verwenden.

Sherlock

Bernhard Geyer 24. Nov 2008 11:02

Re: Speicher freigeben
 
Deine explizite Freigabe ist unnötig da du beim konstruktur das Formular als Owner angegebn hast.

Häng mal FastMM rein. Auch Inder produzieren teilweise Speicherlücken (bzw. schlechten Code).

texmurphy901 24. Nov 2008 11:08

Re: Speicher freigeben
 
Oh...das ging ja schnell.
zu den beiden Antworten: Ja beim Beenden wird der Speicher wieder frei gegeben.

Und die Bemerkung mit dem Speicherloch ist ebenfalls zutreffen: Bei jedem Blättern im Dokument geht weiter Speicher flöten, der dann ebenfalls nicht freigegeben wird.
Dieses Problem habe ich versucht mit meiner geschilderten Methode zu umgehen, quasi als Workaround bis der Hersteller sich ENDLICH mal meldet.

Aber es muss doch einen Weg geben, dass ich den Speicher wieder frei bekomme?


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