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 3 von 6     123 45     Letzte »    
Ghostwalker

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

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

  Alt 6. Okt 2016, 10:40
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.
Angehängte Dateien
Dateityp: zip vsttest.zip (3,2 KB, 11x aufgerufen)
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
 
#22

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

  Alt 6. Okt 2016, 10:41
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.
Angehängte Dateien
Dateityp: 7z InitSample.7z (753,6 KB, 7x aufgerufen)
Dateityp: zip InitSample.zip (1,01 MB, 20x aufgerufen)

Geändert von Aviator ( 6. Okt 2016 um 10:55 Uhr) Grund: Projekt auch noch als ZIP angehängt
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

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

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

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

  Alt 6. Okt 2016, 12:38
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.

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.

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

n/a Beiträge
 
#25

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

  Alt 6. Okt 2016, 12:50
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.
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 12:55
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.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#27

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

  Alt 6. Okt 2016, 12:59
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)
TMyDataClasses = TObjectList<TMyDataClass>; Habe daraus, hoffe es ist nicht falsch, jetzt mal = TObjectList; gemacht.

Geändert von Jim Carrey ( 6. Okt 2016 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#28

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

  Alt 6. Okt 2016, 13:09
TObjectList<T> steht nicht in Contnrs, sondern in Generics.Collections.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 6. Okt 2016, 13:40
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)
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 TObjectList<TMyDataClass> eine reine 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.
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#30

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

  Alt 6. Okt 2016, 13:42
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     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 08:08 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