TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1675
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Beitrag von corpsman »

Servus zusammen, sry für den komischen Titel, ..

Ich habe hier ein TStringgrid in dass ich LogDaten lade. Mein Problem ist nun, dass alle paar hunder ms ein neuer Datensatz kommt, wenn ich dann immer in etwa folgendes mache:

Code: Alles auswählen

  // Pseudocode
  index := StringGrid1.RowCount;
  StringGrid1.RowCount := StringGrid1.RowCount + 1;     
  for i := 0 to StringGrid1.ColCount -1 do
  StringGrid1.cells[i, index] := 'Daten';
Dann rauscht mir die Performance spätestens bei ca. 1000 Zeilen in den Keller, und sind erst mal mehr drin warte ich gefühlt ewig.

Woran das liegt ist mir auch klar, ich erhöhe ein array immer nur um 1 Element, dass ist natürlich fatal.

Kennt ihr nen weg wie man das TStringgrid clever puffern lassen kann oder muss ich eine Andere Komponente nehmen ?

StringGrid1.BeginUpdate; / StringGrid1.EndUpdate(true); hilft hier auch nicht wirklich ..
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1675
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Beitrag von corpsman »

Wie sich heraustellt ist das Tstringgrid 1a, was aber die gesamte Performance kaputt macht ist

Code: Alles auswählen

StringGrid1.AutoSizeColumns;  
Macht man das nur wenn es absolut notwendig ist, dann ist alles so schnell wie es sein soll :)
--
Just try it

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 418
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Beitrag von Jorg3000 »

Tach!
Vermutlich genügt AutoSizeColumns() solange nur z.B. bis 100 Zeilen enthalten sind, dann dürften die ermittelten Spaltenbreiten wahrscheinlich auch für die meisten weiteren Zeilen passend sein.

Eine Sache könntest du zusätzlich ausprobieren:
Wenn man anfangs .ColCount := 1; und .RowCount := 10000; setzt (danach wieder auf Anfangswerte, alles mit Begin/EndUpdate) wird für die dahinterliegende Liste ein großer Zeilenspeicher reserviert.
Vielleicht wird dieser Zeilenspeicher beibehalten, wenn man es wieder runtersetzt (nicht getestet). Dann würde schrittweises +1 vielleicht schneller gehen.
Grüße, Jörg

Benutzeravatar
Zvoni
Beiträge: 474
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Beitrag von Zvoni »

corpsman hat geschrieben: Mi 3. Dez 2025, 07:44 Wie sich heraustellt ist das Tstringgrid 1a, was aber die gesamte Performance kaputt macht ist

Code: Alles auswählen

StringGrid1.AutoSizeColumns;  
Macht man das nur wenn es absolut notwendig ist, dann ist alles so schnell wie es sein soll :)
Was eigentlich logisch ist: AutoSizeColumns berechnet ja die Breite jedesmal, ganz zu schweigen vom "Paint-Job"
Vielleicht die zu dem Zeitpunkt grösste "Breite" pro Spalte in einer Variablen (Array, Record, was auch immer) speichern, und AutoSizeColumns nur aufrufen, wenn eine "neue grösste" Breite ankommt?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7021
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TStringGrid iteratives Zeilen Hinzufügen beschleunigen, .. ? gelöst

Beitrag von af0815 »

Warum Loggst du in eine visuelle Komponente wie das Stringgrid ? Das ganze in eine normale Liste auslagern und wenn du es brauchst, das was man sehen soll in ein Grid kopieren. So kannst du ev. auch den Lesetask in einen Thread auslagern und bekommst kein Problem mit der GUI.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten