2

wxWidgets と Visual C++ を使用して、GUI でリッチ フォーマット (色、フォント、画像) を備えた Unix の "tail -f" を使用するのと同様の機能を作成しています。私は wxMSW と wxMAC の両方をターゲットにしています。

明白な答えは、wxTextCtrl::SetDefaultStyle() と wxTextCtrl::WriteText() への呼び出しを使用して、wxTE_RICH で wxTextCtrl を使用することです。

しかし、リリース モードでコンパイルされた 3 GHz ワークステーションでは、1 行あたり平均 1 ミリ秒増加するログを追跡し続けることができず、最終的には遅れます。各行について、私は負担しています:

  1. SetDefaultStyle() への 2 回の呼び出し
  2. 2 つの呼び出し 2 つの WriteText()
  3. ウィジェットの Freeze() および Thaw() の呼び出し

これを実行すると、約 20,000 行を埋めた後、wxMSW を使用して 1 つのコアで CPU が 100% になります。プログラムは、特定のしきい値に達すると目に見えて遅くなり、さらに遅れをとります。

私は他のコントロール (wxListCtrl、wxRichTextCtrl など) を使用することにオープンです。

4

3 に答える 3

1

ビュー内の行数を制限することを検討しましたか? 同様の問題が発生したとき、ビューに 10,000 行を超えないようにしました。より多くの行が下部にある場合は、上部の行を削除します。これは WxWidgets を使用しておらず、Mac でネイティブの Cocoa UI を使用していましたが、問題は同じです。スタイル付きのテキスト ビュー (色、書式設定、きれいな印刷) が大きくなると、下部にデータを追加するのがかなり遅くなります。

于 2008-09-29T14:38:01.950 に答える
0

wxVListBox から派生。ドキュメントから:

wxVListBox はリストボックスに似たコントロールであり、通常のリストボックスとは次の 2 つの主な違いがあります: それ自体はアイテムを保存せず、OnDrawItem() コールバックを使用して描画するため、任意の数のアイテムを保持できます (つまり、仮想リスト ボックスです)。リストボックス) とそのアイテムは、OnMeasureItem() によって決定される可変高さを持つことができます (したがって、可変高さの行を持つリストボックスでもあります)。

于 2009-10-24T06:27:38.323 に答える
0

あなたが使用しているコントロールは、あなたが投げているデータの量に合わせて構築されていないようです。カスタム コントロールの作成を検討します。考慮に入れることができるいくつかの事項を次に示します。

  1. 新しい行が入ってきても、前の行を再レンダリングする必要はありません...それらは変更されず、新しいデータのためにレイアウトが変更されることはありません。
  2. 目に見える部分とルックバックの数画面だけを一度にメモリに保持するようにしてください。これにより、少し軽くなります...しかし、ユーザーがルックバックよりもさらにスクロールバックできるようにして、すべてがシームレスに見えるようにする場合は、独自のスクロール管理を行う必要があります。
  3. 一度に 1 行ずつ更新する必要はありません。新しいデータがあれば、すべて取得して更新します。10 行を非常に迅速に取得し、画面を一度に更新すると、行ごとに行うオーバーヘッドの一部を節約できる可能性があります。

お役に立てれば。

于 2008-10-02T15:37:06.887 に答える