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
Seite 2 von 6     12 34     Letzte »    
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#11

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

  Alt 6. Okt 2016, 00:01
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#12

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

  Alt 6. Okt 2016, 00:03
Letzte Frage für heute: wie gebe ich die Nodes denn wieder frei, wenn er bei Finalize meckert?

Mein Problem ist folgendes...
der Speicherverbrauch meiner Anwendung liegt beim Start bei 11 MB. Nachdem die VST gefüllt ist bei 70 MB. Wenn ich das Formular mit der VST schließe bleibt alles bei 70 MB.
Bei Klassen? Das ist in meinem Beispiel ja dabei.
Wird das Formular nur geschlossen oder auch freigegeben?
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#13

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

  Alt 6. Okt 2016, 00:04
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?

VST.GetNodeData<TTreeData>(Node).Free; kann ich leider nicht ausführen. Ich glaube mein Delphi (XE3) ist zu alt.
Der Fehler lautet nicht genügende Parameter und dass Free unbekannt sei.

Geändert von Jim Carrey ( 6. Okt 2016 um 00:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#14

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

  Alt 6. Okt 2016, 00:13
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.

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?
Wenn du Klassen nutzt und diese nur erstellst und nicht freigibst, ja.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 00:15
Du machst ja scheinbar jetzt folgendes:

Delphi-Quellcode:
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;
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.

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;
Wenn du dazu noch ein Beispiel brauchst, dann sag bescheid. Dann schreib ich dir schnell eins oder schaue ob ich noch irgendwo eins finde.
Mich würde das auf jeden Fall interessieren Habe bisher nie mit so riesigen Datenmengen gearbeitet und deshalb immer nur AddChild verwendet, aber die Methode mit dem nachträglichen Initialisieren klingt interessant.
Ich werde mal so ein Beispiel aufbauen. Aber wie jeanicke es ebenfalls schon erwähnt hat, brauchst du eine entsprechende Datenstruktur aus der du dir die Daten dann beim Initialisieren ziehen kannst. Sei es eine Query oder eine eigene Klassenstruktur wo Objekte bspw. in einer ObjectList abgelegt sind.

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.
  Mit Zitat antworten Zitat
Ghostwalker

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

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

  Alt 6. Okt 2016, 06:55
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 ?
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 08:31
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 ?
Lies dir mal Beitrag #4 durch. Dort erklärt jaenicke wieso das so ist.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#18

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

  Alt 6. Okt 2016, 09:35
Du machst ja scheinbar jetzt folgendes:

Delphi-Quellcode:
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;
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.

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;
Nicht ganz ich mache es so (da steht Record aber es ist eine Class, keine Sorge!)
Delphi-Quellcode:
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;
und freigeben
Delphi-Quellcode:
procedure TForm2.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
 Data: PTreeData;
begin
 Data := VST.GetNodeData(Node);
 Data^.Free;
end;
Ich werde mir später mal das neue VST runterladen und prüfen. Aber mit meiner aktuellen Version zeigt der Taskmanager nie "weniger" an.
Ich habe übrigens Version 5.3.0: (04 Jan 2014) sehe ich gerade.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#19

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

  Alt 6. Okt 2016, 09:55
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?
Das ist genau dann "normal", wenn man ein Speicherloch hat.
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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 09:56
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 6     12 34     Letzte »    


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 22:55 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