Wie schnell lesen und schreiben in listview in Delphi?

8

Es gibt eine Listenansicht mit mehreren Feldern in Delphi. Ein Thread prüft und fügt Elemente zur Listenansicht hinzu. Wenn dieselbe Beschriftung vorhanden ist, wird eine Ganzzahl im Unterpunkt dieser Beschriftung hinzugefügt. Wenn die Anzahl der Elemente unter 2000 liegt, ist die Leistung in Ordnung. Beim Überprüfen und Hinzufügen von Elementen und Elementen zählen mehr als etwa 2000, die Leistung ist schlecht. Wenn die Anzahl der Objekte größer als 20.000 ist, kann die Leistung als extrem langsam beschrieben werden. Gibt es eine Möglichkeit, in listview schnell zu lesen und zu schreiben, wenn die Objekte 50.000 oder 100.000 erreichen können?

Vielen Dank im Voraus

Bearbeiten:

Wir haben alle Ihre Antworten gelesen und danken Ihnen für Ihre Hilfe.

    
Dylan 20.11.2010, 12:07
quelle

6 Antworten

9

Sie müssen nur Ihre Liste im "virtuellen" Modus verwenden.

  1. Legen Sie eine TListBox auf Ihr Formular;
  2. Legen Sie die Style-Eigenschaft auf lbVirtual fest.
  3. Legen Sie die Count-Eigenschaft auf die Anzahl der Elemente Ihrer Liste fest.
  4. Verwenden Sie anschließend den OnData-Handler, um den auf Anforderung anzuzeigenden Text bereitzustellen:

Wie in diesem Code (ersetzen Sie mit einigen Daten aus Ihrer Datenbank oder einer TStringList o.ä.):

%Vor%

Sie können die Zeichnung weiter anpassen, indem Sie den lbVirtualOwnerDraw-Stil verwenden, und Sie müssen Objekte mithilfe eines OnDrawItem-Ereignishandlers zeichnen. Es gibt einen Beispielcode in der Delphi-Dokumentation (zumindest unter Delphi 7). ;)

Im virtuellen Modus können Sie sofort 50000 oder 100000 Elemente anzeigen.

Zum Speichern des Textes ist die Verwendung einer guten alten TStringList schneller als die Items-Methode der TListBox, da diese Items [] -Eigenschaft für jedes Element mit "langsamen" GDI-Nachrichten mit Windows kommunizieren muss, während eine TStringList dies tut Speichere den Text einfach im Delphi-Heap, der normalerweise viel schneller ist.

    
Arnaud Bouchez 20.11.2010, 17:00
quelle
10

Das Delphistool TListView-Steuerelement ist ein Wrapper um die Windows-Listenansichtskomponente. In der Standardbetriebsart werden Kopien der Listendaten von Ihrer App an die Windows-Steuerung übertragen und dies ist langsam.

Die Alternative dazu ist in der Windows-Terminologie als virtuelle Listenansicht bekannt. Ihre App übergibt die Daten nicht an das Windows-Steuerelement. Wenn das Steuerelement Daten anzeigen muss, fragt es stattdessen Ihre App nur nach den benötigten Daten ab.

Das Delphi TListView-Steuerelement macht virtuelle Listenansichten mithilfe der OwnerData-Eigenschaft verfügbar. Sie müssen Ihren Listenansichtscode etwas umschreiben, aber es ist wirklich die einzige Lösung.

    
David Heffernan 20.11.2010 12:31
quelle
6

Sie können BeginUpdate und EndUpdate in der Listenansicht aufrufen, um die Leistung zu verbessern, indem Sie verhindern, dass sich die Listenansicht während der Aktualisierung neu anzeichnet. Aber das wird dir wahrscheinlich nicht den Schub geben, den du willst. Außerdem müssen Sie wissen, dass der Zugriff auf VCL-Steuerelemente direkt aus einem Thread nicht sicher ist, es sei denn, es wird synchronisiert.

Ich denke, es wäre besser, die Listenansicht zu überspringen und ein Steuerelement von Drittanbietern wie Virtual Tree View auszuwählen, was sowohl großartig ist als auch frei. :)

    
GolezTrol 20.11.2010 12:16
quelle
3

Vor einigen Jahren haben wir festgestellt, dass zusätzlich zu BeginUpdate / EndUpdate der ViewStyle der ListView zu vsIcon geändert wurde, bevor große Datenmengen hinzugefügt wurden, und zurück zu vsRepord, nachdem wir die Performance erheblich verbessert hatten. Das war unter Windows 98 und Windows 2000 wenn ich mich richtig erinnere so bin ich mir nicht sicher, ob das immer noch so ist.

    
dummzeuch 20.11.2010 14:46
quelle
3

BeginUpdate und EndUpdate sind ein absolutes Muss beim Aktualisieren der Elemente. Aus Ihrer Beschreibung klingt es, als ob Sie die Elemente durchlaufen, die nach einer bestimmten Bildunterschrift suchen. Dies ist langsam und wird offensichtlich bei größeren Datenmengen deutlicher.

Da Sie nach einer passenden Überschrift suchen, verwenden Sie die Funktion listviews FindCaption .

Dies führt einen Windows-Aufruf zum Suchen der Elemente durch und ist ziemlich schnell und einfach. Wenn es gefunden wird, gibt es den Artikel zurück und Sie können darauf verweisen, um den Unterpunkt zu aktualisieren. Andernfalls erstellen Sie einen neuen Artikel und fahren mit der Bearbeitung fort.

Solange Ihr Thread sicher ist und Sie eine anständige Leistung sehen können.

HTH.

    
Ryan J. Mills 21.11.2010 03:09
quelle
2

Probieren Sie eine virtuelle Listview mit dem OnData-Handler aus.

Die Daten verbleiben in Ihrer eigenen Datenstruktur. Die Listenansicht ruft Ihren OnData-Handler auf, um genau die Datenelemente zu erhalten, die er benötigt, wenn er sie benötigt. Sie extrahieren die bestimmten Daten aus Ihrer Datenstruktur, wenn Sie danach fragen.

Ihre andere Aufgabe besteht darin, den ItemCount der Liste auf die Anzahl der Elemente in der Liste zu beschränken.

    
Bill99 20.11.2010 12:31
quelle

Tags und Links