AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Nodes einer VirtualStringTree hinzufügen - aber schneller!
Thema durchsuchen
Ansicht
Themen-Optionen

Nodes einer VirtualStringTree hinzufügen - aber schneller!

Ein Thema von Jim Carrey · begonnen am 5. Okt 2016 · letzter Beitrag vom 6. Okt 2016
Antwort Antwort
Jim Carrey
(Gast)

n/a Beiträge
 
#1

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 15:18
Aber zur Theorie.. woran könnte es gelegen haben, dass der Speicher vorher nicht wieder freigegeben wurde obwohl doch die Knoten mit .Free alle einzeln aufgerufen wurden?
Ich habe sogar zum Test beim Hinzufügen der Knoten jeden einzelnen validieren lassen aber auch das half nichts.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 15:25
Aber zur Theorie.. woran könnte es gelegen haben, dass der Speicher vorher nicht wieder freigegeben wurde obwohl doch die Knoten mit .Free alle einzeln aufgerufen wurden?
Ich habe sogar zum Test beim Hinzufügen der Knoten jeden einzelnen validieren lassen aber auch das half nichts.
Ohne SourceCode ist das reine Spekulation. Wenn du den noch hast, dann stell ihn mal hier rein. Bei Gelegenheit schau ich (oder die anderen) dann mal drüber. Wird ja nichts extrem kompliziertes sein denke ich.

Die andere Frage wäre jetzt, ob das nicht egal ist. Es läuft ja jetzt. ReportMemoryLeaksOnShutdown gibt dir auch keine Meldung aus? Wenn nicht, dann ist alles gut.

Und beachte auch noch Post #36 von Daniel bzgl. des Speicherverbrauchs einer Anwendung. Wenn du da genaueres wissen willst, dann solltest du dir evtl. den ProcessMonitor anschauen. Der müsste das genauer darstellen. Aber da ist jaenicke der Profi drin. Mit dem kenne ich mich nicht so gut aus.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#3

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 15:36
Den Code habe ich leider nicht mehr.

Zitat:
Die andere Frage wäre jetzt, ob das nicht egal ist. Es läuft ja jetzt. ReportMemoryLeaksOnShutdown gibt dir auch keine Meldung aus? Wenn nicht, dann ist alles gut.
Nicht ganz.
Ich erstelle in meiner Schleife für jeden Knoten den ich zur VST hinzufüge parallel einen eigenständigen Datensatz. Das will ich irgendwann einmal ändern aber nicht jetzt.

Früher benutze ich ein Record. Da stehen ein paar Strings, Booleans und Integers drin. Später habe ich daraus Class gemacht, da ich diese Klassen-Instanz dann einer ObjectList hinzufüge, welche später benötigt wird.

Delphi-Quellcode:
Datensatz := TMeinDatenSatz.Create;
DatenSatz.MeinString := '123';
MeineObjektListe.Add(DatenSatz); // Liste hat OwnsObjects auf False, da das sonst Fehler gibt
Nun gehe ich diese Liste durch und gebe alles frei:
Delphi-Quellcode:
for i := MeineObjektListe.Count - 1 downto 0 do
 begin
  TMeinDatenSatz(MeineObjektListe.Items[i]).Free;
  MeineObjektListe.Delete(i);
 end;

 MeineObjektListe.Free;
Beim Beenden des Programms dann die Meldung, dass dutzende Unicode-Strings nicht freigegeben wurden. Das sind zu 100% die aus TMeinDatenSatz.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 15:47
Wie erzeugst du deine ObjectList?

Wenn du folgendes machst, dann brauchst du gar nichts freizugeben. Das macht die Liste dann für dich. Anders sieht es aus wenn du dem Constructor als Parameter ein False mitgibst.

Delphi-Quellcode:
procedure CreateList();
begin
  MeineObjektListe := TObjectList.Create(); // Create hat einen optionalen Boolean Parameter OwnsObjects der standardmäßig true ist
end;


procedure FreeList();
begin
  MeineObjektListe.Free; // Sofern OwnsObjects auf true steht, werden hier alle enthaltenen Objekte automatisch freigegeben
end;
Wie sieht denn deine TMeinDatensatz Klasse aus? Wird dort denn im Destructor immer alles schön freigegeben?
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 15:52
OwnsObjects habe ich auf False, da es sonst Probleme gibt.

Ich habe eine ObjectList mit allen Informationen drin und diese ObjectList teile ich auf weitere ObjectListen auf. Deswegen muss es False sein.
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 16:01
Sorry. Hatte den Kommentar übersehen. In dem Fall wäre der SourceCode deiner erzeugten Klasse hilfreich. Ich befürchte aber das da irgendwas beim Verschieben der Objekte in eine andere Liste passiert.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!

  Alt 6. Okt 2016, 16:09
Zitat:
Ich befürchte aber das da irgendwas beim Verschieben der Objekte in eine andere Liste passiert.
Ich hatte mich versehentlich falsch ausgedrückt!

Der ObjectList-Schnick-Schnack wird gar nicht ausgeführt aktuell. Daran liegt es nicht. Sorry.

Meine Klassen-Instanzen erzeuge ich wie oben bereits geschrieben.
Delphi-Quellcode:
type
 TMeinDatenSatz = class

 private
  FIrgendeinString: String;
  FIrgendeinBoolean: Boolean;
 public
  property IrgendeinString: String read FIrgendeinString write FIrgendeinString;
  property IrgendeinBoolean: Boolean read FIrgendeinBoolean write FIrgendeinBoolean;
 end;

/////////////////////////////////////////////////////////////////////////////////////////////

MeinDatenSatz := TMeinDatenSatz.Create;
TMeinDatenSatz.IrgendeinString := 'ABC';
TMeinDatenSatz.IrgendeinBoolean := False;
MeineObjectList.Add(TMeinDatenSatz);

/////////////////////////////////////////////////////////////////////////////////////////////

for i := MeineObjectList.Count - 1 downto 0 do
 begin
  TMeinDatenSatz(MeineObjectList.Items[i]).Free;
  MeineObjectList.Delete(i);
 end;

MeineObjectList.Free;
Das hier ist eine 1-zu-1-Übertragung nur mit geänderten Variablen-Namen, um es einfacher zu halten.

Ich sehe gerade lustigerweise, dass der Leak nur auftritt, wenn es Knoten in meiner VST gab die nicht sichtbar waren (also Scrollbar war da).
Wenn diese zu lange VST aber einmal alle Knoten angezeigt hat, gibt es den Leak trotzdem.

Wenn die VST nur 10 Knoten enthielt und alle sofort bei FormShow sichtbar waren, gab es den Leak nicht.
Wenn ich bei den 10 Knoten das Fenster verkleinere und bei FormShow nicht alle angezeigt werden, gibt es den Leak -nicht-.
Scheint also ein "Problem mit Massen" zu sein.

Geändert von Jim Carrey ( 6. Okt 2016 um 16:15 Uhr)
  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 15:10 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