![]() |
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 |
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?
|
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? |
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. |
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 |
AW: TListview Aktualisierung durch Thread(s) optimieren?
Wie lange dauert das reinschreiben? Oder ist evtl. die aktion zum Einlesen der Inhalte der Bremser?
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
Wie befüllst Du die ListView (Code)? Evtl. hast Du ja einfach nur versehentlich eine Bremse eingebaut.
|
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.
|
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; |
AW: TListview Aktualisierung durch Thread(s) optimieren?
Zitat:
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
Ich dachte ich kann keine direkte TStringliste an einen TListview übergeben?
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
Zeig uns doch einfach Deinen Code (den relevanten Teil).
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
Habe ich bereits in einem vorherigen Post getan :)
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
Wie lange dauert folgendes:
Delphi-Quellcode:
Das ist die Zeit der GUI-Eintragen + Aktualisieren.
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; |
AW: TListview Aktualisierung durch Thread(s) optimieren?
Ist GetAllDataSets etwa eine Funktion?
|
AW: TListview Aktualisierung durch Thread(s) optimieren?
@DeddyH: Ja. Ist das "böse"?
@Bernhard Geyer: 296ms Also ist das auch schonmal schlecht. Danke! |
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.
|
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? |
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 10:17 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