Listviews beschleunigen
-
Ich habe eine Frage zu ListViews.
Ich benutze einen Listview als Log-Fenster bei dem ich immer nur ans Ende eine
neue Zeile schreibe. Da es sehr viele Zeilen werden können begrenze ich diese auf eine
Maximalzahl. Das scrollen ist jetzt leider massiv abhängig von der Größe des Fensters und scheint pixelweise das Fenster nach oben zu scrollen.
Gibt es sinnvolle Möglichkeiten dies zu beschleunigen? Ein zeilenweise Scrollen wäre ideal.
Auch die Prozessorlast läßt sich durch die Größe des Fensters von 20 bis 80 % Kernelmode varieren.item.iImage = ICON_PRINTF; item.iItem = ListView_GetItemCount(hLstBox_01); item.pszText=DisplayStream->szText; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iSubItem = 0; ListView_InsertItem(hLstBox_01,&item); item.iItem++; if (item.iItem > ANZLINES_IN_LOG_SCROLLBUFFER) ListView_DeleteItem(hLstBox_01, 0); ListView_Scroll( hLstBox_01, 0, 10); UpdateWindow(hLstBox_01);
Eine weitere Frage ist, gibt es Möglichkeiten mehr als eine Zeile aus dem Scrollbuffer zu löschen. Wenn man keine Zeile löscht und hat so 300 000 Zeilen im Buffer meldet sich das System krank mit Swapfile voll. Die einzige Möglichkeit die ich gefunden habe ist ab einer gewissen Zeilenzahl für jede Zeile die reinkommt die älteste zu löschen.
Lohnt es sich vielleicht von der Laufzeit in diesem Fall 100 oder 1000 Zeilen vom Anfang her
zu löschen?Danke für eure Hilfe
-
Du solltest auf den UpdateWindow-Aufruf verzichten, ist auch völlig überflüssig. Etwas mehr Geschwindigkeit könntest Du erreichen, indem Du WM_SETREDRAW verwendest:
SendMessage(hLstBox_01, WM_SETREDRAW, FALSE, 0); // Hier Einträge hinzufuegen/ loeschen . . . SendMessage(hLstBox_01, WM_SETREDRAW, TRUE, 0); InvalidateRect(hLstBox_01, NULL, FALSE);
Eventuell ist es auch geschickter, anstelle von ListView_Scroll das Makro ListView_EnsureVisible zu verwenden. Einfach mal probieren.
/EDIT: Du kannst item.iItem auch einfach auf MAXLONG setzen. Das erspart Dir den Aufruf von ListView_GetItemCount.
-
@King
Danke für die Hilfe, leider bringt keine der Methoden einen entscheidenden Zeitvorteil,
die Änderungen sind kleiner als die Variationen der Zeiten im System.Der Vorteil ist, die Routine ist jetzt wesentlich aufgeräumter.
-
Gut, wenn's das nicht bringt, wirst Du auf ein Virtual ListView zurückgreifen müssen. Schau Dir dazu mal das Style LVS_OWNERDATA an. Das wird dann aber etwas mehr Aufwand.