Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Nodes einer VirtualStringTree hinzufügen - aber schneller! (https://www.delphipraxis.net/190454-nodes-einer-virtualstringtree-hinzufuegen-aber-schneller.html)

Ghostwalker 6. Okt 2016 09:40

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
Liste der Anhänge anzeigen (Anzahl: 1)
So..hab mal ein kleines Test-Prog gebaut (Turbo Delphi !). Das sagt mir was gaaanz anderes als
jaenicke gesagt hat, bzgl. Klassen.

Ich häng das mal an, evtl. kannst du dir da was abuggen.

Aber wie Daniel bereits sagte, erstmal mit kleinen Datenmengen anfangen. Läßt sich leichter
nachvollziehen.

Aviator 6. Okt 2016 09:41

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo zusammen,

ich habe mal ein kleines Beispiel zusammengestellt das Wahlweise 100.000 oder auch 1.000.000 Objekte und dementsprechend genauso viele Nodes erzeugt. Zusätzlich wird das ganze noch minimalistisch mit GetTickCount protokolliert damit man mal eine grobe Vorstellung hat wie lange so etwas dauert.

Ich hoffe das Beispiel hilft dir/euch beim besseren Verwalten eurer Nodes und trägt zum Beschleunigen eures Programms bei.

Ich habe 2 Varianten erstellt die per Compilerschalter gewählt werden können. Einmal wird im NodeData nur der Index zum Object in der ObjectList hinterlegt und beim anderen Beispiel wir direkt der Pointer zum Object übergeben. Da kann dann jeder für sich entscheiden was ihm/ihr besser gefällt. Der Code wurde dadurch zwar etwas unübersichtlicher, aber ich denke es wird trotzdem deutlich wie es funktioniert.

Wenn Ihr Fragen dazu habt, dann stellt sie.

Angehängt das Testprojekt. Im Release Ordner ist auch schon eine fertige Exe damit ihr das theoretisch direkt mal ausprobieren könnt. Die aktuelle Exe wurde mit dem Compilerschalter erstellt der bewirkt, dass nur der Index aus der ObjectList im NodeData hinterlegt wird. Was schlussendlich für euch besser ist müsst ihr selbst entscheiden.

Das FreeNode Event fällt durch die Verwendung der ObjectList raus, da diese die Objecte (wenn OwnsObjects auf True steht) selbst verwaltet.

EDIT: Mir ist gerade aufgefallen, dass ich vergessen habe das OnGetNodeDataSize Event einzubauen. In diesem Fall ist es allerdings nicht schlimm, da ein Cardinal und ein Zeiger auf ein Objekt soweit ich weiß 4 Byte belegen. Das ist auch die Standardeinstellung des VST. Wer es dennoch einbauen möchte der kann folgendes schreiben:

Delphi-Quellcode:
procedure TForm1.vst1GetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer);
begin
  {$IFDEF WITHCARDINAL}
  NodeDataSize := SizeOf(Cardinal);
  {$ELSE}
  NodeDataSize := SizeOf(TMyDataClass);
  {$ENDIF}
end;
Und dann natürlich noch das Event mit dem Tree verknüpfen.

jaenicke 6. Okt 2016 11:13

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

Zitat von Aviator (Beitrag 1349942)
Löschst du denn auch die Nodes mit vst.Clear(). Ansonsten kann auch nichts freigegeben werden.

Das stimmt nicht, zumindest nicht mit der aktuellsten Version (mit der ich es getestet hatte). Bei der Freigabe der Tree wurde auch OnFreeNode aufgerufen.

Aviator 6. Okt 2016 11:38

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

Zitat von jaenicke (Beitrag 1349971)
Zitat:

Zitat von Aviator (Beitrag 1349942)
Löschst du denn auch die Nodes mit vst.Clear(). Ansonsten kann auch nichts freigegeben werden.

Das stimmt nicht, zumindest nicht mit der aktuellsten Version (mit der ich es getestet hatte). Bei der Freigabe der Tree wurde auch OnFreeNode aufgerufen.

Ja natürlich werden dann auch die Nodes gelöscht wenn der Tree freigegeben wird, das ist ja klar. Das wäre ja sonst ein Fehler in der VirtualTreeView Komponente. :shock:

Nur es hat sich für mich so angehört, dass der Speicherverbrauch bei der Benutzung nicht sinkt wenn er Nodes löscht oder eine neue Ansicht laden will. Eventuell hat er ja auch das Event falsch implementiert oder ist mit seinen Klassen durcheinander gekommen.

Edit: Außerdem wenn er den Speicherverlauf/Speicherverbrauch während der Ausführung beobachten will, dann sollte er die Nodes manuell mit vst.Clear() löschen.

Jim Carrey 6. Okt 2016 11:50

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
Ich habe nun folgendes gemacht.
- ich füg lediglich 10 Nodes hinzu
- im FreeNode-Event ist ein Breakpoint an erster Stelle nach begin
- im FormClose steht VST.Clear;

Am Breakpoint wird nicht angehalten.
Wenn ich da Showmessage('Free'); renischreibe, bekomme ich das aber 10x angezeigt.

Aviator 6. Okt 2016 11:55

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

Zitat von Jim Carrey (Beitrag 1349975)
Am Breakpoint wird nicht angehalten.

Weiß jetzt leider nicht welche Delphi Version du hast. Könntest du bei Gelegenheit mal in deinem Profil hinterlegen.

Aber hast du auch die Build Konfiguration auf Debug und nicht auf Release stehen? Wie wird die Zeile/der Breakpoint nach dem Compilieren angezeigt? Ist er blau oder grün? Blau bedeutet, dass er angesprungen wird (sofern keine Bedingung im BreakPoint hinterlegt ist). Grün heißt, dass er aus welchen Gründen auch immer (häufig die Build Konfiguration) nicht anhält weil keine Debug Infos mit einkompiliert wurden.

Jim Carrey 6. Okt 2016 11:59

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
Delphi XE3 und Release.
NodeFree wird angesprungen, das sehe ich ja an der Showmessage.

Irgendetwas stimmt aber bei mir generell nicht.

Nicht einmal folgende Zeile lässt sich compilieren, da TObjectList<> angeblich ein undeklarierter Bezeichner ist (Contnrs steht in den uses)
Delphi-Quellcode:
TMyDataClasses = TObjectList<TMyDataClass>;
Habe daraus, hoffe es ist nicht falsch, jetzt mal = TObjectList; gemacht.

DeddyH 6. Okt 2016 12:09

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
TObjectList<T> steht nicht in Contnrs, sondern in Generics.Collections.

Aviator 6. Okt 2016 12:40

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

Zitat von Jim Carrey (Beitrag 1349977)
Delphi XE3 und Release.
NodeFree wird angesprungen, das sehe ich ja an der Showmessage.

Irgendetwas stimmt aber bei mir generell nicht.

Nicht einmal folgende Zeile lässt sich compilieren, da TObjectList<> angeblich ein undeklarierter Bezeichner ist (Contnrs steht in den uses)
Delphi-Quellcode:
TMyDataClasses = TObjectList<TMyDataClass>;
Habe daraus, hoffe es ist nicht falsch, jetzt mal = TObjectList; gemacht.

Wie DeddyH schon sagt ist TObjectList<T> in System.Generics.Collections deklariert. Wenn du aus
Delphi-Quellcode:
TObjectList<TMyDataClass>
eine reine
Delphi-Quellcode:
TObjectList
machst ist das zwar nicht direkt falsch, aber du musst dann an jeder Stelle auf das passende Objekt casten. Durch die Generics hast du eben den Vorteil, dass du direkt die Elemente vom richtigen Typ zurück bekommst.

Jim Carrey 6. Okt 2016 12:42

AW: Nodes einer VirtualStringTree hinzufügen - aber schneller!
 
Aviator, ich glaube ich bleibe lieber bei meiner standard-Variante. Ich bekomme deine Version nicht zum Laufen.

Im VSTGetText steht einzig und allein
Delphi-Quellcode:
var
 Data: PTreeData;
begin
 Data := VST.GetNodeData(Node);

 case Column of
  0: ShowMessage(Data^.sFileName);
 end;
Das führt zu einer Zugriffsverletzung.
Auf die ObjectList kann ich auch nicht zugreifen, da er dann meckert dass Integer und TreeData nicht zusammenpassen.
Mit meiner Standard-Methode müsste aber doch eigentlich auch der Speicher freigegeben werden. NodeFree wird doch aufgerufe, ich verstehe das nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:54 Uhr.
Seite 3 von 6     123 45     Letzte »    

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