![]() |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Der Punkt bei der späteren Initialisierung ist, dass du aus dem Index eines Knotens die dazu gehörenden Daten herausfinden können musst.
Dafür brauchst du in der Regel eine dahinterliegende Datenstruktur, aus der du die Daten dann holen kannst. Die Frage ist wie viel Zeit du brauchst um diese Datenstruktur zu initialisieren. Wenn das sehr schnell geht, ist der Weg in der Tat gut machbar. |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Zitat:
Wird das Formular nur geschlossen oder auch freigegeben? |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Das Formular mit dem VST wird nur geschlossen.
Generelle Frage: ist es normal, dass der TaskManager den Speicherverbrauch der Anwendung, wenn ich das VST-Formular schließe, nicht senkt und bei jedem Ausführen meiner Methode immer nur erhöht?
Delphi-Quellcode:
kann ich leider nicht ausführen. Ich glaube mein Delphi (XE3) ist zu alt.
VST.GetNodeData<TTreeData>(Node).Free;
Der Fehler lautet nicht genügende Parameter und dass Free unbekannt sei. |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Dein Delphi ist nicht zu alt, aber deine VST Version vermutlich. Hast du die neu aus dem Repository ausgecheckt? (Das würde ich sehr empfehlen.)
Alternativ kannst du natürlich auch die nicht-generische Version von GetNodeData benutzen und auf die Klasse casten um Free aufzurufen. Zitat:
|
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Du machst ja scheinbar jetzt folgendes:
Delphi-Quellcode:
Da du in dem Beispiel oben (das jeanicke im übrigen auch so nur mit Generics gezeigt hat) ein Objekt instanziiert hast, musst du das dann auch wieder freigeben.
procedure TForm1.LoadNodes();
var NodeData: PNodeData; Node: PVirtualNode; begin Node := vst.AddChild(nil); NodeData := vst.GetNodeData(Node); NodeData^ := TNodeData.Create(); // Hier führst du einen Konstruktor einer Klasse aus end; Also erstellt du dir einen EventHandler für das OnFreeNode Event des VST.
Delphi-Quellcode:
procedure TForm1.vstFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var NodeData: PNodeData; begin NodeData := vst.GetNodeData(Node); NodeData^.Free; end; Zitat:
Es ist etwas umständlicher zu programmieren, aber es zahlt sich bei der Geschwindigkeit und auch bei der Speicherauslastung aus. Besonders wenn man sehr viele Nodes hat die Children besitzen. Dann brauchst man bspw. die Children erst zu laden wenn der User explizit die Node aufklappen will. |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
moin :)
Wie die Kollegen vorher schon anmerkten, ist die Variante mit RootNodeCount die schneller, da von vornherein die Anzahl fest steht und die ganze Initialisierung des Trees in einem Rutsch geht. Als Beispiel kannst du dir da auch mal das SpeedDemo im Demo-Ordner von VST anguggen. Das Zeit-Problem hat meistens seine Ursache im Sammeln der Daten, die angzeigt werden sollen. Ich hatte z.B. mal eine Art Mini-Explorer gebaut und dabei den Fehler gemacht, die gesamte Verzeichnisstruktur der Platte auf einen Schlag zu ermitteln. Ergebnis war, das das Initialisieren des Trees sehr lange dauerte. Was mir etwas komisch vorkommt ist, das eine Klasse schneller sein soll, als ein reiner Zeiger auf die Daten. Die Initalisierung einer Instanz sollte doch ein bischen mehr tun, als eine Zuweisung der Werte im Speicher. Werd das mal austesten. oder hat jemand eine Erklärung dafür ? :) |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Zitat:
|
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Zitat:
Delphi-Quellcode:
und freigeben
procedure AddVSTStructure(aVST: TVirtualStringTree; aRecord: TTreeData);
var Data: PTreeData; Node: PVirtualNode; begin Node := aVST.AddChild(nil); Node.CheckType := ctCheckBox; Node.CheckState := csCheckedNormal; Data := aVST.GetNodeData(Node); Data^ := aRecord; end;
Delphi-Quellcode:
Ich werde mir später mal das neue VST runterladen und prüfen. Aber mit meiner aktuellen Version zeigt der Taskmanager nie "weniger" an.
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var Data: PTreeData; begin Data := VST.GetNodeData(Node); Data^.Free; end; Ich habe übrigens Version 5.3.0: (04 Jan 2014) sehe ich gerade. |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Zitat:
Fang doch erstmal klein an. Setze 10 Knoten in Deinen Baum und gib die ordentlich wieder frei. Das kannst Du mit Breakpoints und ggf. sogar mittels Einzelschritt präzise nachverfolgen. Bevor Dein Code nicht im Kleinen funktioniert, brauchst Du Dir um die große Lösung nur wenig Gedanken machen. |
AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
Löschst du denn auch die Nodes mit vst.Clear(). Ansonsten kann auch nichts freigegeben werden. Setz doch mal einen Breakpoint auf die erste Zeile in deinem OnFree Event. Hält der Debugger dort überhaupt an?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 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