2008-09-29 4 views
2

J'utilise wxWidgets et Visual C++ pour créer des fonctionnalités similaires à l'utilisation d'Unix "tail -f" avec un formatage riche (couleurs, polices, images) dans une interface graphique. Je cible à la fois wxMSW et wxMAC.Comment ajouter rapidement une grande quantité de contenu riche (images, formatage) à un contrôle sans utiliser des tonnes de CPU?

La réponse évidente est d'utiliser wxTextCtrl avec wxTE_RICH, en utilisant les appels à wxTextCtrl :: SetDefaultStyle() et wxTextCtrl :: WriteText().

Cependant, sur mon poste de travail 3ghz, compilé en mode release, je suis incapable de conserver un journal qui croît en moyenne de 1 ms par ligne, pour finir par être en retard. Pour chaque ligne, je suis encourais:

  1. Deux appels à SetDefaultStyle()
  2. Deux appels deux WriteText()
  3. Un appel à gel() et Thaw() le widget

Lors de l'exécution de cette opération, mon processeur passe à 100% sur un cœur en utilisant wxMSW après avoir rempli environ 20 000 lignes. Le programme est visiblement plus lent une fois qu'il atteint un certain seuil, tombant plus loin derrière.

Je suis ouvert à l'utilisation d'autres contrôles (wxListCtrl, wxRichTextCtrl, etc.).

Répondre

0

Dérivé de wxVListBox. A partir de la documentation:

wxVListBox est un contrôle semblable à listbox avec les deux principales différences d'une zone de liste régulière suivante: il peut avoir un nombre arbitraire énorme d'articles parce qu'il ne les stocke pas lui-même, mais utilise OnDrawItem() callback pour les dessiner (donc c'est une listbox virtuelle) et ses items peuvent avoir une hauteur variable comme déterminé par OnMeasureItem() (donc c'est aussi une listbox avec les lignes de Variable height).

1

Avez-vous envisagé de limiter le nombre de lignes dans la vue? Lorsque nous avons eu un problème similaire, nous nous sommes assurés que jamais plus de 10 000 lignes ne sont visibles. Si plus de lignes arrivent en bas, nous supprimons les lignes en haut. Il n'utilisait pas WxWidgets, il utilisait une interface Cocoa native sur Mac, mais le problème est le même. Si une vue de texte stylée (avec des couleurs, une mise en forme et une jolie impression) devient trop volumineuse, l'ajout de plus de données en bas devient plutôt lent.

0

Il semblerait que le contrôle que vous utilisez ne soit pas construit pour la quantité de données que vous lancez. Je envisagerais de construire un contrôle personnalisé. Voici quelques choses que vous pourriez prendre en compte:

  1. Quand une nouvelle ligne arrive, vous n'avez pas besoin de re-rendre les lignes précédentes ... ils ne changent pas et la mise en page ne changera pas en raison aux nouvelles données.
  2. Essayez de ne conserver en mémoire que la partie visible plus quelques écrans de rétrospective. Cela le rendrait un peu plus léger ... mais vous devrez faire votre propre gestion de défilement si vous voulez que l'utilisateur puisse revenir plus loin que votre rétrospective et que tout semble transparent.
  3. Ne met pas nécessairement à jour une ligne à la fois. Quand il y a de nouvelles données, prenez tout et mettez à jour. Si vous obtenez 10 lignes très rapidement et que vous mettez à jour l'écran en une seule fois, vous pouvez économiser sur une partie des frais généraux en procédant ligne par ligne.

Espérons que cela aide.

Questions connexes