AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Memoryleak bei dynamischen Forms ?

Ein Thema von Ghostwalker · begonnen am 28. Jun 2007 · letzter Beitrag vom 28. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#1

Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 06:47
Ich hab hier ein kleines Testprogramm geschrieben, das, neben dem Hauptformular, mehrere Unterformulare hat (mit je einem Riesenbild zur Verdeutlichung ).

Diese Unterformulare werden im Hauptform per Listbox ausgewählt und per Buttonclick dynamisch erzeugt:

Delphi-Quellcode:
  procedure THauptformular.Showform(Item:integer);
  begin
    case item of
       0 : begin
             form1 := TForm1.Create(self);
             form1.onclose := DoCloseSubForm;
             form1.Tag := item;
             form1.Show;
           end;
       1 : begin
             form2 := TForm2.Create(self);
             form2.OnClose := DoCloseSubForm;
             form2.Tag := item;
             form2.Show;
           end;
       2 : begin
             form3 := TForm3.Create(self);
             form3.onclose := DoCloseSubForm;
             form3.Tag := item;
             form3.Show;
           end;
       3 : begin
             form4 := TForm4.Create(self);
             form4.onclose := DoCloseSubForm;
             form4.Tag := item;
             form4.Show;
           end;
       4 : begin
             form5 := TForm5.Create(self);
             form5.onclose := DoCloseSubForm;
             form5.Tag := item;
             form5.Show;
           end;
       5 : begin
             form6 := TForm6.Create(self);
             form6.onclose := DoCloseSubForm;
             form6.Tag := item;
             form6.Show;
           end;
       6 : begin
             form7 := TForm7.Create(self);
             form7.onclose := DoCloseSubForm;
             form7.Tag := item;
             form7.Show;
           end;
    end;
  end;
Soweit funktioniert das ganze auch wunderbar.

Beim Schließen des Unterformulars wird die Instanz nun wieder freigegeben:

Delphi-Quellcode:
procedure THauptformular.DoCloseSubForm(Sender: TObject;
  var Action: TCloseaction);
begin
  action := caFree;
end;
Das scheint aber nur teilweise zu funktionieren. Lt. Taskmanager bleiben etwa 650Kb stehen und zwar jedesmal, also wenn ich die Unterformulare 5 mal aufrufe, bleiben insgesamt 3250 Kb stehen !!. Wie kommt das und wie kann man das verhindern ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 07:16
Werden die Formulare auch wirklich zerstört und nicht nur versteckt? Ich hatte mit der Freigabe an der Stelle bis jetzt kein Problem.
Gib auch mal explizit dein "Riesenbild" mit frei.

Gruß oki
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 07:41
Wie schließst du die Fenster?
Markus Kinzler
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 08:02
Nimm doch einfach MemProof oder FastMM, damit hast Du gleich die Zeile, in der das Leck auftritt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 08:55
@mkinzler

Über caFree im onClose-Event (siehe Quelltext).

@alzaimar

Memproof hab ich probiert, aber der zeigt nada an. FastMM werd ich noch probieren.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 09:19
Zitat von Ghostwalker:
@mkinzler
Über caFree im onClose-Event (siehe Quelltext).
Äh.. THauptFormular wird mit caFree freigegeben, und die TForm1...TForm5 auch? Das steht da nicht
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 09:41
Nein..wie man aus dem Quelltext sehen kann, weise ich jedem Unterformular die DoCloseSubForm-Methode des Hauptformulars zu (die hat nix mit onClose vom Hauptformular zu tun !!). In dieser wird das Formular freigegeben via caFree.

Das Hauptformular wird ganz normal beim Programmstart erzeugt und am ende freigegeben.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 09:44
Hupsa... Au weia

Ah.. ich weiss es (vielleicht). Wieso sollten diese Formulare freigegeben werden, außer Du schließt sie alle explizit am Programmende?

Ersetze das 'Formx := TFormx.Create(Self)' durch ein 'Application.CreateForm (TFormx, Formx)' und dann werden die Formulare auch beim Programmende freigegeben.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#9

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 09:56
Ähm...ok...vielleicht auch mal mein vorgehen :

Ich starte das Programm -> Hauptformular wird normal aufgebaut

-> auswahl eines der Unterformulare ->Speicheranstieg ->Unterformular wird angezeigt
-> Ich schließe das Unterformular -> wird teilweise freigegeben, es bleiben aber ca. 650 K stehen
-> Ich öffne ein anderes Unterformular -> Speicheranstieg -> Unterformular wird angzeigt.
-> Ich schließe auch dieses -> wieder nur teilweise freigegeben, wieder bleiben ca 650K stehen.

Wenn ich das Programm komplett beende bleibt in dem sinn nix stehen (lt. Memproof und FastMM).

Was interresant ist, wenn ich das gleiche Unterformular zweimal auf und zu mache bleibts bei den 650K.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Memoryleak bei dynamischen Forms ?

  Alt 28. Jun 2007, 09:58
Hallo,

das caFree spielt AFAIK nur eine Rolle bei MDI,
weil dort der Standard caHide ist.


ein Formular muss explizit per Form.Free freigegeben werden,
es sei denn du nimmst das oben erwähnte Application.CreateForm.

Ein Modales Fenster muss also z.B. immer so aufgerufen werden
Delphi-Quellcode:
  Form:= TForm.Create(Self);
  try
    Form.ShowModal;
  finally
    Form.Free;
  end;

Zum Taskmanager,
wann genau stehen die 3MB zu viel Speicher drin ?

So richtig verstehe ich dein "5mal aufrufen" nicht.

setz doch mal nen Breakpoint auf TForm1.Destroy
(Ereugnis erzeugen, irgendwas dort machen, z.B. i:= 0)
und schaue nach, ob der Breakpoint angesprungen wird.

Das mit dem "bleibt" 650 kB kann ich jetzt nicht so verstehen


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 11:19 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