Wie anhängen ich eine große Menge an Rich Content (Bilder, Formatierungen) schnell zu einer Kontrolle ohne Tonnen von CPU zu verwenden?

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin mit wxWidgets und Visual C ++ Funktionalität erstellen ähnlich wie bei Unix "tail -f" mit Rich-Formatierung (Farben, Schriften, Bildern) in einer GUI. Ich bin sowohl wxMSW und wxMac Targeting.

Die offensichtliche Antwort ist wxTextCtrl mit wxTE_RICH zu verwenden, indem Anrufe wxTextCtrl :: SetDefaultStyle () und wxTextCtrl :: Writetext ().

Allerdings auf meiner 3ghz Workstation im Release-Modus kompilierte, ich bin nicht in der Lage zu halten, ein Protokoll holend, die im Durchschnitt von 1 ms pro Zeile hinter, schließlich fallen wächst. Für jede Zeile, ich entstehen:

  1. Zwei Anrufe SetDefaultStyle ()
  2. Zwei nennt zwei Writetext ()
  3. Ein Anruf Freeze () und Tauen () das Widget

Wenn diese ausgeführt wird, meine CPU geht auf einem Kern zu 100% mit wxMSW nach etwa 20.000 Zeilen füllen. Das Programm ist sichtbar langsamer, sobald es eine bestimmte Schwelle erreicht hat, weiter hinten zu fallen.

Ich bin offen für die Verwendung anderer Kontrollen (wxListCtrl, wxRichTextCtrl, etc).

War es hilfreich?

Lösung 3

Man leitet aus wxVListBox. Aus der Dokumentation:

  

wxVListBox ist eine listbox artige Steuerung mit den folgenden zwei Hauptunterschiede von einem regulären Listbox: es eine beliebig große Anzahl von Elementen haben kann, weil sie nicht sie selbst nicht speichert, sondern nutzt OnDrawItem () Rückruf sie zu zeichnen (so es ist eine virtuelle listbox) und seine Elemente als variable Höhe von OnMeasureItem bestimmt haben () (so ist es auch ein Listenfeld mit den Linien der Höhe variabel ist).

Andere Tipps

Haben Sie darüber nachgedacht, die Anzahl der Zeilen in der Ansicht zu begrenzen? Wenn wir ein ähnliches Problem hatten, haben wir nur sicher nie mehr als 10.000 Zeilen in der Ansicht sind. Wenn mehr Zeilen am Ende kommen wir entfernen Linien an der Spitze. Dies wurde nicht mit WxWidgets, es wurde eine native Cocoa-Benutzeroberfläche auf dem Mac verwenden, aber das Problem ist das gleiche. Wenn ein Stil Textansicht (mit Farben, Formatierungen und ziemlich Druck) zu groß wird, am Boden mehr Daten anhängen wird ziemlich langsam.

Klingt wie die Kontrolle, die Sie verwenden, ist einfach nicht für die Datenmenge gebaut man es werfen. Ich würde eine benutzerdefinierte Steuerung aufzubauen. Hier einige Dinge, die Sie berücksichtigen können:

  1. Wenn eine neue Linie kommt, brauchen Sie nicht erneut machen die bisherigen Linien ... sie nicht ändern und das Layout wird nicht aufgrund der neuen Daten ändern.
  2. Versuchen
  3. , um nur den sichtbaren Teil zu halten und ein paar Bildschirme von Look-back im Speicher zu einem Zeitpunkt. Dies würde es ein wenig leichter ... aber Sie müssen Ihre eigene Scroll-Management tun, wenn der Benutzer möchte in der Lage zu blättern weiter zurück als Ihren Look-Back-und machen es erscheinen nahtlos sein.
  4. Sie müssen nicht unbedingt aktualisieren, eine Zeile zu einem Zeitpunkt. Wenn neue Daten vorhanden sind, greifen sie alle und zu aktualisieren. Wenn Sie 10 Zeilen wirklich schnell, und Sie den Bildschirm auf einmal aktualisieren, können Sie auf einige der Overhead speichern Sie es Zeile für Zeile zu tun.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top