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
Aviator

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

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
 
#2

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
Aviator

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

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

  Alt 6. Okt 2016, 16:23
Ich glaube da hast du irgendwo noch einen Denkfehler in deinem Code. An der Klasse wird es so wie die aufgebaut ist und so wie du es sagst nicht liegen.

Ich vermute eher, dass da doch mit dem Init und so noch nicht so richtig funktioniert. Aber ohne mehr SourceCode oder eine ganze Unit wird das sehr schwer dir da weiterzuhelfen.

Genaugenommen haben MemoryLeaks ja auch nix mehr mit dem eigentlichen Thema zu tun. Die schnellere Erstellung der Nodes ist ja denke ich jetzt abgeschlossen.

Aber noch eine Sache zu deiner Freigabe:

Delphi-Quellcode:
for i := MeineObjectList.Count - 1 downto 0 do begin
  TMeinDatenSatz(MeineObjectList.Items[i]).Free;
  MeineObjectList.Delete(i);
end;
Brauchst du den Cast auf TMeinDatenSatz wirklich? Wie ist denn deine ObjectList deklariert? Benutzt du Generics oder noch nicht? Wenn du Generics benutzt, dann ist der Cast total überflüssig da du schon ein Objekt von genau dem Typ zurück erhältst.

EDIT: Mit "Massen" wird das nichts zu tun haben. Ich habe eine Anwendung in der mehrere 1000 (durchaus mal 20.000) Nodes und dementsprechend viele Objekte erzeugt werden. Bei der Freigabe bleibt rein gar nichts an Leaks zurück.

Geändert von Aviator ( 6. Okt 2016 um 16:25 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#4

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

  Alt 6. Okt 2016, 16:33
Ich benutze die normale TObjectList. Generics versuche ich zu vermeiden wo es geht. Ohne ließt es sich einfacher finde ich.

Ich teste gleich mal, ob es an was anderem liegen könnte. Denn ich hab eben erst gesehen, dass ich in der Klasse auch eine Variable verwende die einen Enum-Typen hat.
Edit: ok das hat sich erledigt. Denn selbst wenn ich NUR die Klasseninstanz erzeuge und sie der ObjectList hinzufüge kommt der Leak. Das heißt ich weise keine Daten zu und er kommt dennoch.

Geändert von Jim Carrey ( 6. Okt 2016 um 16:36 Uhr)
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 16:59
Ich benutze die normale TObjectList. Generics versuche ich zu vermeiden wo es geht. Ohne ließt es sich einfacher finde ich.
Naja. Jeden das Seine. Aber gerade dieses rumgecaste macht es doch erst unübersichtlich. Das fällt ja bei den Generics weg. Lediglich beim Instanziieren und bei der Deklaration findet man ein solches Konstrukt TObjectList<TMyDataType> . Und dafür kann man sich dann noch einen eigenen Type anlegen und schon ist alles schön übersichtlich und man muss den Datentyp auch nur noch an einer Stelle im Code pflegen. type TMyDataTypeList = TObjectList<TMyDataType>
Erzeug mal nur die Instanz und gib sie wieder frei und beende dann das Programm. Erscheint dann auch schon ein MemoryLeak?
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#6

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

  Alt 6. Okt 2016, 17:34
Wenn ich eine Instanz mit einem Button erzeuge und im selben Button ein MeineKlasse.Free; folgt, gibt es kein Leak.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

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

  Alt 6. Okt 2016, 17:42
Sorry für den doppelten Eintrag aber @Aviator und alle anderen, ihr werdet es nicht glauben.
Fehler gefunden und er war SO UNGLAUBLICH dumm, das gibt es nicht!
Also, kurz und schmerzlos, lachen könnt ihr danach: meine Schleifen-Variable i war als ShortInt deklariert!
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

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

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

  Alt 6. Okt 2016, 17:43
Bei noch nicht validierten Nodes wird das OnFreeNode Event nicht aufgerufen (in den neueren Versionen allerdings nicht getestet). Dieses Verhalten ist allerdings "as designed". Lies dir mal das hier durch:
http://www.delphipraxis.net/1194331-post12.html bzw. das hier http://www.delphipraxis.net/1194335-post15.html
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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