![]() |
AW: VirtualStringTree - Nodes hinzufügen
Ich weiß nicht, aber kann es sein, dass dir dein Virenscanner dazwischen redet? Je nach Virenscanner wird jede Datei die angepackt wird, wenn auch nur markiert im Explorer, gescannt. Was mir aufgefallen ist, dass dein Programm beim ersten Durchlauf etwa 6 Sekunden gebraucht hat, dann stets um die 600 ms. Falls du einen Virenscanner hast, schalte den mal für einen Test ab.
Ansonsten finde ich, dass dein Fenster etwas zäh ist, d. h. länger für den Aufbau braucht. Evtl. liegt das an deiner Komponente. Wendest du auch BeginUpdate und EndUpdate im Code? |
AW: VirtualStringTree - Nodes hinzufügen
das könnte daran liegen dass ich den font und den hintergrund einfärbe und jeweils zwei icons pro node hinzufüge.
jawohl. nutze begin und endupdate. wenn der letzte node erreich ist, rufe ich aber einmal VST.Invalidate auf da sonst, wenn zu wenige nodes vorhanden sind (keine scrollbar), die nodes nicht eingefärbt werden. sehr interessanter ansatz mit dem virenscanner. aber mit ausgeschaltetem und eingeschaltetem virenscanner benötigt die testanwendung 4.5 sekunden. seltam. |
AW: VirtualStringTree - Nodes hinzufügen
Nun, das könnte alles ein Grund sein, aber mein Beispiel nutzt das nicht und braucht bei dir auch 5 Sekunden.
|
AW: VirtualStringTree - Nodes hinzufügen
ja, das ist sehr seltsam.
auch seltsam ist dass mein beispiel bei dir das erste mal länger braucht als danach. aber wie bereits gefragt, kann es sei dass das daran liegt dass ich einen laptop benutze? |
AW: VirtualStringTree - Nodes hinzufügen
Reduzieren wir alles auf das Nötigste. Führe mal den Code aus und gibt das Ergebnis aus der Zwischenablage hier zurück:
Delphi-Quellcode:
uses
DateUtils, Clipbrd; procedure Test(SearchPath: String; var Sum: Integer); var SearchRec: TSearchRec; begin SearchPath := IncludeTrailingPathDelimiter(SearchPath); if FindFirst(SearchPath + '*.*', faAnyFile or faDirectory, SearchRec) = 0 then try repeat Inc(Sum); until FindNext(SearchRec) <> 0; finally FindClose(SearchRec) end; if FindFirst(SearchPath + '*.*', faDirectory, SearchRec) = 0 then try repeat if ((SearchRec.Attr and faDirectory) = faDirectory) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then Test(SearchPath + SearchRec.Name, Sum); until FindNext(SearchRec) <> 0; finally FindClose(SearchRec) end; end; procedure TForm1.Button1Click(Sender: TObject); var T1, T2: TTime; A: Integer; s: String; begin T1 := Now; A := 0; Test('c:\windows\', A); T2 := Now; s := Format('Anzahl Daten: %d; Zeit im Millisekunden: %d', [A, MilliSecondsBetween(T1, T2)]); ShowMessage(s); Clipboard.AsText := s; //kopiert Ergebnis in Zwischenablage end; |
AW: VirtualStringTree - Nodes hinzufügen
ok, also. programm (nur dieser code) wurde kompiliert und direkt mit der ide ausgeführt.
klick 1: Anzahl Daten: 119168; Zeit im Millisekunden: 4319 klick 2: Anzahl Daten: 119168; Zeit im Millisekunden: 4189 klick 3: Anzahl Daten: 119168; Zeit im Millisekunden: 4087 |
AW: VirtualStringTree - Nodes hinzufügen
Dann liegt das am Zugriff und nicht an deinem Programm. Irgendwo gibt es eine Bremse.
Und Laptop? Ich kenne Probleme mit Laptops, aber keine diesbezüglich. Evtl. Überhitzung? Was sagt HD Tune? Keine Temperaturanzeige? Führe mal ![]() |
AW: VirtualStringTree - Nodes hinzufügen
HDTune sagt dass meine systemfestplatte 32°C warm ist. meine sekundäre festplatte welche verbaut ist ist 32°C warm. denke nicht dass das heiß wäre für einen laptop.
edit: ich melde mich in wenigen minuten nochmal, denn CrystalDiskInfo zeigt mir ganz neue optionen und informationen. z.b. lautstärke und performance-regler. edit 2: also. nach änderung dieser akustikeinstellungen auf "leistung" wird dein code, popov, nun in 3.8 sekunden (statt 4 bis 4.3)ausgeführt und meiner in 4.8 sekunden (statt 5 bis 6). aber mehr passiert da nicht. |
AW: VirtualStringTree - Nodes hinzufügen
Also bei mir ist das mit einer Samsung 840er Evo SSD auch nicht schneller... 191.000 Dateien und 5-9 Sekunden (beim ersten Start die 9 Sekunden, logisch, danach weniger)...
|
AW: VirtualStringTree - Nodes hinzufügen
DAS gibt mir zu denken.
das bedeutet dass selbst eine SSD nicht viel schneller zu sein scheint und demnach das problem nicht bei mir liegt, da es eventuell gar keins gibt? ich glaube ich muss in die klappsmühle. warum erreichst du, popov, so gute zeiten und wir beide nicht? |
AW: VirtualStringTree - Nodes hinzufügen
Dann scheint mit meinem Rechner etwas nicht zu stimmen. Ich hab gerade andere Ordner getestet und einen mit 111000 Dateien gelesen, da hat er auch lange gebraucht, beim weiteren Mal aber in Millisekundenbereich. Ungeachtet dessen, der Windowsordner ist immer in 300 ms gelesen.
|
AW: VirtualStringTree - Nodes hinzufügen
Zitat:
Zitat:
|
AW: VirtualStringTree - Nodes hinzufügen
bei windows 8.1 enthält der fast 200.000 dateien? wahnsinn. bei mir, windows 7, sind es etwas weniger als 100.000.
edit: ein test in einer windows-xp-vm hat ergeben, dass der erste durchlauf etwa 1.5 sekunden benötigt und alle danach 500ms etwa. |
AW: VirtualStringTree - Nodes hinzufügen
Zitat:
|
AW: VirtualStringTree - Nodes hinzufügen
Nun ja, 100.000 ist eine Sache, aber das Thema drehte sich ab Anfang um 13.000 Daten
|
AW: VirtualStringTree - Nodes hinzufügen
Auf meinem W7 braucht das Programm für 120.000 Dateien im Windowsverzeichnis auf einer SSD 2100 ms.
|
AW: VirtualStringTree - Nodes hinzufügen
Zitat:
|
AW: VirtualStringTree - Nodes hinzufügen
Liste der Anhänge anzeigen (Anzahl: 1)
Weiter vorne wurde kurz über CheckBoxen in Virtual ListView gesprochenm, dass sie nicht da sind (bei OwnerData = True), und dass es kompliziert ist sie selbst zu erstellen. Damals habe ich auch kurz nach einer Lösung im Internet gesucht und auch nur komplizierte gefunden, was die Aussage irgendwie bestätigte.
Dabei steht die simple Lösung in der Delphi-Hilfe in einem Nebensatz, bei Thema StateIndex. Man benötigt demnach zwei Check-Box Bitmaps in einer ImageList, die wiederum StateImages zugewiesen ist. Je nachdem wie wie der Wert von StateIndex ist, -1, 0 oder 1, wird entweder nichts gezeichnet (Standard), die eine Bitmap oder die andere (in dem Fall Bild von CheckBox). Was dann noch zu tun bleibt ist eine Routine schreiben die die CheckBoxem per Kausklick setzt. Ist auch nicht kompliziert. Im Grunde also alles simpel. Hier das Beispiel (falls noch Interesse besteht). Vermutlich kann man das noch eleganter lösen, aber das ist auch nicht kompliziert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 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