Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VST mit ca. 50.000 Datensätze verdammt langsam, warum??? (https://www.delphipraxis.net/144428-vst-mit-ca-50-000-datensaetze-verdammt-langsam-warum.html)

Piro 7. Dez 2009 19:58


VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Guten Abend,

ich verwende ein VST, um Daten aus einer MS SQL Express 2005 anzuzeigen. Es kann vorkommen, dass das VST um die 50.000 Datensätze erhält. Wenn die Daten ins VST geschrieben werden, dauert es unwahrscheinlich lange (gefühlte 2 Minuten).

Die Daten werden in eine Klasse gespeichert, so wie es im Video-Tutorial vom Stammtisch zu sehen ist.

Folgendes mache ich mit dem VST:
- Haederleiste bekommt einen Hintergrund
- GetText, um die Daten anzuzeigen
- GetImageIndex
- CompareNode

Das ist eigentlich alles. Wenn ich GetText und CompareNode herausnehme. Geht es etwas schneller aber noch nicht schnell genug.

Kann es sein, dass ein VST für solche Datenmengen nicht gemacht ist, weil das VST dann zuviel machen muss und somit langsam wird?

Vielen Dank im voraus.

Sven

mkinzler 7. Dez 2009 20:10

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Die Frage ist auch, ob es sinnvoll ist 50 000 Einträge anzuzeigen

semo 7. Dez 2009 20:13

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Wie füllst du denn den VST? Per InitNode oder per AddNode?
Nutzt du BeginUpdate und EndUpdate?

Meines Wissens stellen 50.000 Einträge kein Problem dar.
Frage ist auch, welche Daten die in dem Data Record des jeweiligen Nodes hinterlegst.

generic 7. Dez 2009 20:17

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
das befüllen sollte schnell gehen, wenn du vst.beginupdate und endupdate verwendest, da der vst nur speicher für den zeiger (und natürlich die Nodestruktur) belegen wird.

vermutlich dauert das umkopieren aus der db so lange.

du könntest, wenn du die anzahl der daten kennst, den nodecount setzen und im oninitnode die zeiger setzen.
das geht dann einen tick schneller.

hoika 7. Dez 2009 20:20

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Hallo,

ich würde erst mal ein paar Breakpoints setzen,
um festzustellen, wo er hängt,
und dann mit 1/2-Einträgen testen,
ob der VST zu viel "unternimmt".


Heiko

Piro 7. Dez 2009 20:33

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Das Programm ist eine Art Verwaltung von Subnetzen mit den jeweilige Wertenbereichen.

Hier meine Datenstruktur:
Delphi-Quellcode:
 type
  TOSubnetDetailsData = class
  private
    //
  public
    id          : String;
    ipaddress   : String;
    device      : String;
    dhcp_exclude : Integer;
    dhcp_mac    : String;
    site        : String;
    building    : String;
    floor       : String;
    position    : String;
    vlan        : String;
    subnetdevice : String;
    description : String;
    sid         : String;

    function GetDHCP_ExcludedName: String;
    property dhcp_excludedname : String read GetDHCP_ExcludedName;
  end;
So lade ich die Daten aus der DB in das VST
Delphi-Quellcode:
procedure Tfrm_main.SQLDataToVST_SubnetDetails;
var
 i                : Integer;
 SubnetDetailsData : TOSubnetDetailsData;
begin
 vst_network_subnetdetails.Clear;

 DSData.Close;
 DSData.CommandText := 'select network_subnetdetails.id,'+
                               'network_subnetdetails.ipaddress,'+
                               'network_subnetdetails.device,'+
                               'network_subnetdetails.dhcp_exclude,'+
                               'network_subnetdetails.dhcp_mac,'+
                               'network_sites.site,'+
                               'network_subnets.building,'+
                               'network_subnets.floor,'+
                               'network_subnets.position,'+
                               'network_subnets.vlan,'+
                               'network_subnets.device as subnetdevice,'+
                               'network_subnetdetails.description,'+
                               'network_subnetdetails.subnet_id '+
                       'from network_subnets '+
                               'inner join network_subnetdetails on network_subnets.id = network_subnetdetails.subnet_id '+
                               'inner join network_sites on network_subnets.site_id = network_sites.id '+
                       'order by cast(parsename([ipaddress], 4) as int),'+
                                'cast(parsename([ipaddress], 3) as int),'+
                                'cast(parsename([ipaddress], 2) as int),'+
                                'cast(parsename([ipaddress], 1) as int)';
 DSData.Open;
 DSData.First;
 for i := 0 to DSData.RecordCount - 1 do
 begin
   SubnetDetailsData := TOSubnetDetailsData.Create;
   with SubnetDetailsData do
   begin
     id          := DSData.FieldByName('id').AsString;
     ipaddress   := DSData.FieldByName('ipaddress').AsString;
     device      := DSData.FieldByName('device').AsString;
     dhcp_exclude := DSData.FieldByName('dhcp_exclude').AsInteger;
     dhcp_mac    := DSData.FieldByName('dhcp_mac').AsString;
     site        := DSData.FieldByName('site').AsString;
     building    := DSData.FieldByName('building').AsString;
     floor       := DSData.FieldByName('floor').AsString;
     position    := DSData.FieldByName('position').AsString;
     vlan        := DSData.FieldByName('vlan').AsString;
     subnetdevice := DSData.FieldByName('subnetdevice').AsString;
     description := DSData.FieldByName('description').AsString;
     sid         := DSData.FieldByName('subnet_id').AsString;
   end;
   vst_network_subnetdetails.AddChild(nil, SubnetDetailsData);
   Application.ProcessMessages;
   DSData.Next;
 end;
 DSData.Close;
end;
Die Abfrage gegen die Datenbank geht schnell und das AddChild dauert seine Zeit. Kann ich da noch etwas optimieren?
Die Struktur und die Methoden sind in Anlehnung an das Stammtisch-Video für VST.

Falls das ein normales Verhalten des VST ist, werde ich den View limitieren.

Sven

wicht 7. Dez 2009 20:37

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Fehlt das BeginUpdate/EndUpdate in der Prozedur, oder ist das irgendwo anders?
Mein Tree ist mit 27.000 Nodes auch blitzschnell, ich denke nicht, dass es am Tree liegt.

HTH

semo 7. Dez 2009 20:38

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Im GetText sollte eigentlich der Text geladen werden, nicht vorher.
Wenn du 50.000 Datensätze hast und 12 strings pro record - da möchte ich mal den Speicherverbauch sehen.

Auch sehe ich kein BeginUpdate und kein EndUpdate.

Normalerweise sollte man einfach per VST.RootNodeCount := DataSet.RecordCount die Anzahl der Nodes festlegen und im InitNode die RecordNo setzen und dann im GetText die Daten zu der RecordID auslesen.

Piro 7. Dez 2009 20:47

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
In dem Videotutorial gab es kein BeginUpdate und EndUpdate. Wozu ist das relevant?

Delphi-Quellcode:
procedure Tfrm_main.FormCreate(Sender: TObject);
begin
 ...
 // Initialisierung - Speichergröße des Node bekanntgeben sonst Exceptions
 vst_network_subnetdetails.NodeDataSize := sizeof(TOSubnetDetailsData);
 ..

Hier meine Methoden für das VST:
Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsAdvancedHeaderDraw(
  Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
  const Elements: THeaderPaintElements);
begin
 if hpeBackground in Elements then
 begin
   PaintInfo.TargetCanvas.Brush.Bitmap := img_bg_20.Picture.Bitmap;

   if PaintInfo.Column <> nil then
     DrawFrameControl(PaintInfo.TargetCanvas.Handle, PaintInfo.PaintRectangle,DFC_BUTTON,DFCS_FLAT or DFCS_ADJUSTRECT);
   PaintInfo.TargetCanvas.FillRect(PaintInfo.PaintRectangle);
 end;
end;

procedure Tfrm_main.vst_network_subnetdetailsAfterItemErase(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  ItemRect: TRect);
begin
 if Sender.Selected[Node] then
   Exit;

 if Odd(Node.Index) then
   TargetCanvas.Brush.Color := $F8F8F8
 else
   TargetCanvas.Brush.Color := clWhite;

 TargetCanvas.FillRect(ItemRect);
end;

procedure Tfrm_main.vst_network_subnetdetailsBeforeCellPaint(
  Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
  Column: TColumnIndex; CellPaintMode: TVTCellPaintMode; CellRect: TRect;
  var ContentRect: TRect);
var
 SubnetDetailsData : TOSubnetDetailsData;
begin
 // Spalte 0 einfärben, wenn es sich um ein Exclude handelt
 SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
 if vst_network_subnetdetails.Header.Columns[Column].Text = '' then
 begin
   if SubnetDetailsData.dhcp_exclude = 0 then
   begin
     TargetCanvas.Brush.Color := $D1D1D1;
     TargetCanvas.FillRect(CellRect);
   end;
 end;
end;

procedure Tfrm_main.vst_network_subnetdetailsCompareNodes(
  Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex;
  var Result: Integer);
var
 SubnetDetailsData1 : TOSubnetDetailsData;
 SubnetDetailsData2 : TOSubnetDetailsData;
begin
 SubnetDetailsData1 := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node1)^);
 SubnetDetailsData2 := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node2)^);
 
 if column > -1 then
 begin
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device'       then Result := CompareStr(SubnetDetailsData1.device, SubnetDetailsData2.device);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'DHCP'         then Result := CompareStr(SubnetDetailsData1.dhcp_excludedname, SubnetDetailsData2.dhcp_excludedname);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'DHCP MAC'     then Result := CompareStr(SubnetDetailsData1.dhcp_mac, SubnetDetailsData2.dhcp_mac);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Site'         then Result := CompareStr(SubnetDetailsData1.site, SubnetDetailsData2.site);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Building'     then Result := CompareStr(SubnetDetailsData1.building, SubnetDetailsData2.building);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Floor'        then Result := CompareStr(SubnetDetailsData1.floor, SubnetDetailsData2.floor);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Position'     then Result := CompareStr(SubnetDetailsData1.position, SubnetDetailsData2.position);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'VLAN'         then Result := CompareStr(SubnetDetailsData1.vlan, SubnetDetailsData2.vlan);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Subnet Device' then Result := CompareStr(SubnetDetailsData1.subnetdevice, SubnetDetailsData2.subnetdevice);
   if vst_network_subnetdetails.Header.Columns[Column].Text = 'Description'  then Result := CompareStr(SubnetDetailsData1.description, SubnetDetailsData2.description);
 end;
end;

procedure Tfrm_main.vst_network_subnetdetailsFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
 SubnetDetailsData : TOSubnetDetailsData;
begin
 SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
 SubnetDetailsData.Free;
end;

procedure Tfrm_main.vst_network_subnetdetailsGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
 SubnetDetailsData : TOSubnetDetailsData;
begin
 SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address'   then CellText := SubnetDetailsData.ipaddress;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device'       then CellText := SubnetDetailsData.device;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'DHCP'         then CellText := SubnetDetailsData.dhcp_excludedname;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'DHCP MAC'     then CellText := SubnetDetailsData.dhcp_mac;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Site'         then CellText := SubnetDetailsData.site;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Building'     then CellText := SubnetDetailsData.building;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Floor'        then CellText := SubnetDetailsData.floor;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Position'     then CellText := SubnetDetailsData.position;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'VLAN'         then CellText := SubnetDetailsData.vlan;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Subnet Device' then CellText := SubnetDetailsData.subnetdevice;
 if vst_network_subnetdetails.Header.Columns[Column].Text = 'Description'  then CellText := SubnetDetailsData.description;
end;

procedure Tfrm_main.vst_network_subnetdetailsHeaderClick(Sender: TVTHeader;
  Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
 if Button = mbLeft then
 begin
   if Column = vst_network_subnetdetails.Header.SortColumn then
     vst_network_subnetdetails.Header.SortDirection := TSortDirection(1-ord(vst_network_subnetdetails.Header.SortDirection))
   else
     vst_network_subnetdetails.Header.SortColumn := Column;
 end;
end;

procedure Tfrm_main.vst_network_subnetdetailsHeaderDrawQueryElements(
  Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
  var Elements: THeaderPaintElements);
begin
 // Erforderlich für das Headerausehen
 Elements := [hpeBackground];
end;
Und was sagts jetzt dazu?

wicht 7. Dez 2009 20:52

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Hast du es wenigstens mal mit Begin/EndUpdate versucht? Das würde dann so aussehen...

Delphi-Quellcode:
DSData.Open;
DSData.First;
vst_network_subnetdetails.BeginUpdate; // Neu
vst_network_subnetdetails.Clear; // Neu
for i := 0 to DSData.RecordCount - 1 do
begin
   SubnetDetailsData := TOSubnetDetailsData.Create;
   with SubnetDetailsData do
   begin
     id          := DSData.FieldByName('id').AsString;
     ipaddress   := DSData.FieldByName('ipaddress').AsString;
     device      := DSData.FieldByName('device').AsString;
     dhcp_exclude := DSData.FieldByName('dhcp_exclude').AsInteger;
     dhcp_mac    := DSData.FieldByName('dhcp_mac').AsString;
     site        := DSData.FieldByName('site').AsString;
     building    := DSData.FieldByName('building').AsString;
     floor       := DSData.FieldByName('floor').AsString;
     position    := DSData.FieldByName('position').AsString;
     vlan        := DSData.FieldByName('vlan').AsString;
     subnetdevice := DSData.FieldByName('subnetdevice').AsString;
     description := DSData.FieldByName('description').AsString;
     sid         := DSData.FieldByName('subnet_id').AsString;
   end;
   vst_network_subnetdetails.AddChild(nil, SubnetDetailsData);
   Application.ProcessMessages;
   DSData.Next;
end;
vst_network_subnetdetails.EndUpdate; // Neu
DSData.Close;
Ansonsten: Kommentier nach und nach deinen Code in den Ereignissen des VT aus und arbeite dich langsam vor. Dann sollte sich das Problem schnell zeigen...

hoika 7. Dez 2009 20:58

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Hallo,

Delphi-Quellcode:
procedure Tfrm_main.SQLDataToVST_SubnetDetails;
var
  i                : Integer;
  SubnetDetailsData : TOSubnetDetailsData;
begin
  vst_network_subnetdetails.BeginUpdate;
  try
    vst_network_subnetdetails.Clear;

    ... und alles andere

   // Application.ProcessMessages;  was soll das denn ????

  finally
    vst_network_subnetdetails.EndUpdate;
  end;
end;
Und lass vor allem das Application.ProcessMessages; weg.

Ausserdem wundert mich, warum du überall String-Vergleiche hast

Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  SubnetDetailsData : TOSubnetDetailsData;
begin
  SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
  if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address'  
     then CellText :=  SubnetDetailsData.ipaddress;
  if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device'      
     then CellText := SubnetDetailsData.device;
end;
Du weisst schon, dass Column (als Integer beginnend mit 0) viel besser geeignet ist,
dann geht es sogar mit case ?

Wenn du schon Strings vergleichst, dann so

Delphi-Quellcode:
procedure Tfrm_main.vst_network_subnetdetailsGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  SubnetDetailsData : TOSubnetDetailsData;
begin
  SubnetDetailsData := TOSubnetDetailsData(vst_network_subnetdetails.GetNodeData(Node)^);
  if vst_network_subnetdetails.Header.Columns[Column].Text = 'IP Address' then
  begin
    CellText := SubnetDetailsData.ipaddress;
     Exit;
  end;
  if vst_network_subnetdetails.Header.Columns[Column].Text = 'Device' then
  begin
    CellText := SubnetDetailsData.device;
    Exit;
  end;
end;
Bringst zumindestens ein bisschen Speed-Up.


Heiko

generic 7. Dez 2009 21:00

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
BeginUpdate verursacht das der Tree sich erstmal nicht neu zeichnet, nicht sortiert und nichts anderes zwischenzeitlich macht.

das app.processmessages würde ich übrigens auch weg lassen.

Piro 7. Dez 2009 21:01

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
ok, ich werde das morgen versuchen. Leider habe ich die Sachen nur auf Arbeit.

Vielen Dank für die guten Ideen. Ich werde es euch wissen lassen, ob es geholfen hat.

Sven

Piro 7. Dez 2009 21:25

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Achso...

Den String Vergleich mache ich deshalb weil die Splaten verschiebbar sind. Oder bleibt zur Laufzeit der ColumIndex gleich dem ColumIndex zur Entwurfszeit?
Wenn nicht, macht der String Vergleich schon Sinn, oder? Natürlich nur mit dem Break.

Piro 7. Dez 2009 21:30

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Ist es empfehlenswert immer mit BeginUpdate und EndUpdate zu arbeiten, wenn etwas am VST gemacht wird? Zum Beispiel beim OnGetText oder OnCompareNode?

Vielen Dank im voraus.

himitsu 7. Dez 2009 21:33

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
nee, isses nicht.

Dieses ist nur nötig, wenn "viel" geändert werden soll, also bei Schreibzugriffen, wie dem Hinzufügen oder Löschen von Nodes.

Und OnGetText, sowie OnCompareNode führen nur Lesezugriffe aus.

pertzschc 7. Dez 2009 22:09

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Zitat:

Zitat von daywalker299
Ist es empfehlenswert immer mit BeginUpdate und EndUpdate zu arbeiten, wenn etwas am VST gemacht wird? Zum Beispiel beim OnGetText oder OnCompareNode?

Wenn Du Daten im Tree änderst, dann ist das sinnvoll es in begin...endupdate zu kapseln.

OnGetText wird ausgelöst, wenn der Text einer bestimmten Zelle o.ä. angezeigt werden soll, z.b. nach einem Scrollen von Zeilen. Zu dem Zeitpunkt wird aber an den Daten(Nodes) des Trees nichts mehr geändert. Ergo ist dafür keine solche Kapselung notwendig und wäre auch kontraproduktiv.

Gruß,
Christoph

Piro 7. Dez 2009 22:11

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Danke.

dominikkv 7. Dez 2009 22:28

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Zitat:

Zitat von daywalker299
Achso...

Den String Vergleich mache ich deshalb weil die Splaten verschiebbar sind. Oder bleibt zur Laufzeit der ColumIndex gleich dem ColumIndex zur Entwurfszeit?
Wenn nicht, macht der String Vergleich schon Sinn, oder? Natürlich nur mit dem Break.

Nein, der ColumIndex bleibt der ColumIndex zur Entwurfszeit, auch wenn du zur Laufzeit die Spalten vertauschst.
.BeginUpdate und .EndUpdate empfiehlt sich nur, wenn du .RootNodeCount änderst (bzw über .AddChild Datensätze hinzufügst, was ich nicht empfehle)

Ich mache das immer so (mit einer Suchfunktion, ist immer ganz praktisch :mrgreen: ):
Delphi-Quellcode:
type
  TMyTreeData = record
    Nr: Integer;
  end;
  PMyTreeData = ^TTreeData;

  ArrayOfInteger = array of Integer;

var
  Nutzdaten: array of TMeineSelbstDefiniertenNutzdaten;
  Ergebnis: ArrayOfInteger;

procedure foo;
begin
  Ergebnis := SucheInNutzdatenNachWort(Nutzdaten, Wort);

  VST.BeginUpdate;
  VST.Clear;
  VST.RootNodeCount := Length(Ergebnis);
  VST.EndUpdate;
end;

procedure Bla.OnVSTInitNode(...);
var
  Data: PMyTreeData;
begin
  Data := VST.GetNodeData(Node);
  Data^.Nr := Ergebnis[Node.Index];
end;

procedure Bla.OnVSTGetText(...);
var
  Data: PTreeData;
begin
  Data := VST.GetNodeData(Node);
  with Data^ do
    case ColumIndex of
      0: ColumText := Nutzdaten[Nr].Wert1;
      1: ColumText := Nutzdaten[Nr].Wert2;
      else ColumText := '';
    end;
end;
Du musst nur am Anfang deine Nutzdaten mit den Werten der Datenbank befüllen.
Wenn du willst kann ich dir auch noch eine schnelle Suchfunktion hier rein stellen.

hoika 7. Dez 2009 22:41

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Hallo,

neeee,
nur beim Füllen des Trees,
dort wird eh (nach EndUpdate) OnGetText aufgerufen.


Heiko

Piro 7. Dez 2009 23:03

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Ich werde wohl bei der AddChild Methode bleiben. Sie kann ja nicht schlecht sein, da sie im Video-Tutorial des Stammtisches enthalten ist.

Mich würde aber trotzdem mal deine Suche interessieren.

FG

Piro 8. Dez 2009 12:47

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Danke an alle. Das Programm läuft unwahrscheinlich schnell mit euren Verbesserungsvorschlägen.

Es ist so gut, dass ich mir mal meine laufenden Programme anschauen werden, um sie ebenfalls zu tunen :-)

Sven

Phoenix 8. Dez 2009 13:03

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Nein ;-) Insbesondere bei GetText wäre es contraproduktiv.
BeginUpdate / EndUpdate schaltet das Neuzeichnen des Trees aus. Das benutzt man immer dann, wenn man Große Veränderungen am Baum macht.

Mit Deinem Code hast Du nicht nur das Neuzeichnen (was extrem viel Zeit kostet) nicht ausgeschaltet, sondern mit ProcessMessages auch noch forciert. Das macht die Ganze Operation extrem Langsam, weil der Baum bei jedem Hinzufügen neu Zeichnet und bei 50.000 mal einen Sekundenbruchteil zeichnen macht halt in Summe schon ne stange Zeit.

Also: BeginUpdate / EndUpdate nur um Massenänderungen (Baum komplett Laden, Sub-Bäume löschen / Hinzufügen) benutzen. UNd dann bitte Application.ProcessMessages auch weglassen.

Wenn die Operation dann immernoch regelmäßig mehr als 2 oder 3 Sekunden dauert kannst Du Dir überlegen, ein kleines 'Ich lade...' Fenster modal anzuzeigen und nach der Operation wieder auszublenden.

Piro 8. Dez 2009 13:27

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
@Phoenix: ich verstehe deinen Thread nicht. Es läuft doch jetzt alles bei mir bestens. Und das was du erzählst, habe ich doch schon umgesetzt.

Danke nochmal.

Die Muhkuh 8. Dez 2009 13:33

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Er hat das Wissen nur noch mal kompakt zusammengefasst ;-)

Phoenix 8. Dez 2009 13:36

Re: VST mit ca. 50.000 Datensätze verdammt langsam, warum???
 
Ich hab die zweite Seite am Thread übersehen und auf Deinen letzten Beitrag auf Seite 1 geantwortet. Etwas im Stress, sorry. :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 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 by Thomas Breitkreuz