Einzelnen Beitrag anzeigen

d7user1
(Gast)

n/a Beiträge
 
#15

AW: VirtualStringTree - Nodes hinzufügen

  Alt 24. Mär 2014, 13:21
hallo, popov, fügst du die daten aus C:\Windows\System32 in deine liste hinzu? und wenn ja, ist es noch immer das beispiel aus deinem anderen thread? denn das war nicht rekursiv meine ich und es waren glaube ich etwas mehr als 2000 daten.

ich habe gerade mal geguckt. daten sammeln (C:\Windows\System32 rekursiv) und diese in records zu speichern ohne daten in der VST anzuzeigen dauert bei mir etwas mehr als 700ms.
man darf nicht vergessen dass ich noch OnPaintText und OnAfterItemErase verwende und dort mit Font.Color und Brush rumgespielt wird.


zu deinem beispiel jaenike:
ich mache alles genau so wie du außer dass ich das nicht auf einen thread ausgelagert habe und dass ich die nodes so erzeuge:
Delphi-Quellcode:
 Node := aVST.AddChild(nil);
 Node.CheckType := ctCheckBox;
 Node.CheckState := csCheckedNormal;

 Data := aVST.GetNodeData(Node);
 Data^ := aRecord;
laut dem post von Popov sind 4 sekunden also normal für das alles was ich mache?

p.s.: selbst wenn ich die Icon in der VST weglasse und die Zellentexte nicht zuweise duaert es bei mir 700ms.
ich glaube der lädt die Icons und die Zellentexte von haus aus erst wenn sie gebracht werden.


hier eine kleine zeitmessung für C:\Windows\System32 NICHT rekursiv:
- das lesen der daten dauert bei mir ungefähr 60ms.
- das erstellen der records ohne nodes zu erzeugen etwa 600ms
- das erstellen der records mit nodes zu erzeugen etwa 650ms
- und alles zusammen mit erstellen und freigeben der dateiliste, BeginUpdate, EndUpdate etwa 700ms.

ist das so in ordnung?


großes edit:
ich weiß jetzt warum das 4 sekunden dauert. beim erstellen meiner records nutze ich einmal IntToStr(getFileSizeA()) und einmal DateTimeToStr(getFileLastModified()).
ohne IntToStr(getFileSizeA()) dauert es nur 1.5 sekunden und ohne DateTimeToStr(getFileLastModified()) dauert es nur 3.3 sekunden.
ohne beides dauert alles zusammen plus anzeigen der 13.000 dateien 400ms.

meine zwei funktionen sehen so aus:
Delphi-Quellcode:
function getFileSizeA(const FileName: string): Int64;
var
 SR: TSearchRec;
begin
 Result := 0;

 if not FileExists(FileName) then
  Exit;

 if FindFirst(FileName, faAnyFile and not faDirectory, SR) = 0 then
  try
   Result := SR.Size;
  finally
   SysUtils.FindClose(SR)
  end;
end;

function getFileLastModified(const FileName: string): TDateTime;
var
 SR: TSearchRec;
 SystemTime: TSystemTime;
 NewWriteTime: TFileTime;
begin
 Result := 0;

 if FindFirst(FileName, faAnyFile, SR) = 0 then
  try
   if (Windows.FileTimeToLocalFiletime(SR.FindData.ftLastWriteTime, NewWriteTime) and
     Windows.FileTimeToSystemTime(NewWriteTime, SystemTime)) then
    Result := Encodedate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay) +
     Encodetime(SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);
  finally
   SysUtils.FindClose(SR)
  end;
end;

Geändert von d7user1 (24. Mär 2014 um 13:59 Uhr)
  Mit Zitat antworten Zitat