Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TListview Aktualisierung durch Thread(s) optimieren? (https://www.delphipraxis.net/160270-tlistview-aktualisierung-durch-thread-s-optimieren.html)

delphinub23 5. Mai 2011 12:27

TListview Aktualisierung durch Thread(s) optimieren?
 
Hallo Delphianer,

ich habe eine TListview in der ca. 50 - 100 Items angezeigt werden.
Dieser TListview soll in einem Intervall(z.B.: 3 sek anhand eines TTimer) aktualisiert werden.

Dadurch, dass alle Items neu eingelesen und verarbeitet werden, geht die Perfomance etwas verloren, d.h. die Applikation hängt während der Aktualisierung.

Bekomme ich durch die Verwendung eines TThread, in dem die Funktion ausgelagert wird, eine Optimierung der Perfomance heraus?

Hinweis: Es ist leider notwendig das Control TListview zu verwenden.

MfG,
dnub

DeddyH 5. Mai 2011 12:34

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Für die paar Items lohnt es sich IMO kaum, einen Thread zu verwenden. Hast Du bereits BeginUpdate und EndUpdate eingesetzt?

WladiD 5. Mai 2011 12:35

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Natürlich kann es durch Threads beschleunigt werden, wenn bei der Aktualisierung blockierende Operationen vorkommen (z.B. Netzwerkabfragen).

Falsch angewendet kann man aber auch das Gegenteil erreichen :wink:

Was passiert denn genau in deiner Aktualisierungsroutine?

Bernhard Geyer 5. Mai 2011 12:39

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Wie verwendest du das ListView? Verwendest du Begin/EndUpdate bzw. den Virtual Modus?

Die eigentliche Aktualisierung des GUI-Controls geht nicht da Win32-GUI-Ressourcen (und damit die VCL) eine Thread-Affinität auffweisen und nur im erzeugenden Thread darauf zugegriffen werden darf.

delphinub23 5. Mai 2011 12:44

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Ja, ich habe bereits BeginUpdate/EndUpdate verwendet nur leider mit mäßigem Erfolg. TListview im VirtualMode ist mir bisher nicht bekannt bzw. die Anwendung ist mir nicht bekannt.

Ich leere das TListview, danach lese ich meine Inhalte ein und schreibe diese innerhalb einer Schleife in das TListview.

Viewmode: vsReport

Bernhard Geyer 5. Mai 2011 12:45

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Wie lange dauert das reinschreiben? Oder ist evtl. die aktion zum Einlesen der Inhalte der Bremser?

DeddyH 5. Mai 2011 12:46

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Wie befüllst Du die ListView (Code)? Evtl. hast Du ja einfach nur versehentlich eine Bremse eingebaut.

delphinub23 5. Mai 2011 12:48

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Also GetTickCount gibt mir für das Einlesen der Daten und setzen der Daten in den TListview 400ms zurück.

delphinub23 5. Mai 2011 12:49

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Das Einlesen der Daten erfolgt über eine Schleife, welche in einer 2ten Schleife läuf, und die Daten ins TListview einträgt (via Item.Add).

Hier der 'langsame Code':

Delphi-Quellcode:
for i := 0 to Pred(Handler.GetAllDataSets.Count) do
begin
  Source := Handler.GetAllDataSets.Strings[i];
  AData := Handler.GetData(Data);
  begin
    lvListItem := lv.Items.Add;
    lvListItem.SubItems.Add(Source);
    lvListItem.SubItems.Add(IntToStr(AData));
    lvListItem.SubItems.Add(Handler.Interpret(Handler.MyData(AData)));
  end;
end;

Bernhard Geyer 5. Mai 2011 12:53

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Zitat:

Zitat von delphinub23 (Beitrag 1099022)
Also GetTickCount gibt mir für das Einlesen der Daten und setzen der Daten in den TListview 400ms zurück.

Und aufgeteil in Einlesen und Eintragen in Listview?

delphinub23 5. Mai 2011 12:56

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Ich dachte ich kann keine direkte TStringliste an einen TListview übergeben?

DeddyH 5. Mai 2011 12:58

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Zeig uns doch einfach Deinen Code (den relevanten Teil).

delphinub23 5. Mai 2011 12:59

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Habe ich bereits in einem vorherigen Post getan :)

Bernhard Geyer 5. Mai 2011 13:01

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Wie lange dauert folgendes:

Delphi-Quellcode:
iCount := Handler.GetAllDataSets.Count;
for i := 0 to iCount - 1 do
begin
  lvListItem := lv.Items.Add;
  lvListItem.SubItems.Add('Test');
  lvListItem.SubItems.Add('Test2');
  lvListItem.SubItems.Add('Test3');
end;
Das ist die Zeit der GUI-Eintragen + Aktualisieren.

DeddyH 5. Mai 2011 13:02

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Ist GetAllDataSets etwa eine Funktion?

delphinub23 5. Mai 2011 13:07

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
@DeddyH: Ja. Ist das "böse"?
@Bernhard Geyer: 296ms

Also ist das auch schonmal schlecht. Danke!

DeddyH 5. Mai 2011 13:08

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Dann setz einmal einen Haltepunkt in diese Funktion und schau, wie oft sie bei Abarbeitung des geposteten Codes durchlaufen wird.

himitsu 5. Mai 2011 13:12

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Auf die ListView sollte man besser nicht via thread zugreifen. (die VCL ist nicht threadsicher)

Man könnte aber im Hintergrund in einem Thread eine Liste zusammenstellen
und dann im Hauptthread oder via Synchronize nur die Änderungen in der ListView anpassen.
Geht natürlich schneller, als die aktuellen Items zu löschen und alles neu zu erstellen.

Aber auch wenn man vorher nur alle Daten im Thread zusammenstellt und dann nur noch alles schnell in den TreeView reinkopiert, sollte es gehen
(alles löschen und Items Anhand der vorher zusammengestellten Daten neu einfügen)

Ansonsten würde ich eher den VirtualTreeView empfehlen, denn dieser arbeitet wesentlich schneller und bietet auch die Möglichkeit ganz schnell Nodes auszutauschen.



Und was macht denn GetAllDataSets intern?

delphinub23 5. Mai 2011 13:18

AW: TListview Aktualisierung durch Thread(s) optimieren?
 
Danke für eure schnelle Hilfe!

@DeddyH: Danke für den eindeutigen Hinweis. Ich stand echt aufm Schlauch :oops:

Jetzt habe ich die Struktur etwas geändert und sieheda < 150ms

MfG
dnub


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 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