2008-09-29 1 views
2

Я использую wxWidgets и Visual C++ для создания функциональности, аналогичной использованию Unix «tail -f» с богатым форматированием (цветами, шрифтами, изображениями) в графическом интерфейсе. Я нацелен как на wxMSW, так и на wxMAC.Как добавить большое количество богатого контента (изображений, форматирования) к управлению без использования тонны процессора?

Очевидным ответом является использование wxTextCtrl с помощью wxTE_RICH, используя вызовы wxTextCtrl :: SetDefaultStyle() и wxTextCtrl :: WriteText().

Однако на моей рабочей станции 3ghz, скомпилированной в режиме выпуска, я не могу сохранить хвост журнала, который растет в среднем 1 мс на строку, в конце концов отстает. Для каждой строки, я подвергаясь:

  1. два вызова SetDefaultStyle()
  2. Два вызова два WRITETEXT()
  3. Вызов Freeze() и оттепели() виджета

При этом мой процессор переходит на 100% на одно ядро, используя wxMSW после заполнения примерно 20 000 строк. Программа заметно медленнее, как только она достигает определенного порога, падая еще дальше.

Я открыт для использования других элементов управления (wxListCtrl, wxRichTextCtrl и т. Д.).

ответ

0

Вывод из wxVListBox. Из документов:

wxVListBox является ListBox-подобный контроль со следующими двумя основными отличиями от обычного ListBox: она может иметь сколь угодно большое количество элементов, потому что не хранит их сам, но использует OnDrawItem() обратный вызов для их рисования (так что это виртуальный список), и его элементы могут иметь переменную высоту, определенную OnMeasureItem() (так что это также список с линиями высоты переменной).

1

Рассматривали ли вы ограничение количества линий в представлении? Когда у нас была аналогичная проблема, мы просто убедились, что в представлении не должно быть более 10 000 строк. Если в нижней части появилось больше строк, мы удаляем строки вверху. Это не использовало WxWidgets, он использовал собственный пользовательский интерфейс Cocoa на Mac, но проблема такая же. Если стиль текстового представления (с цветами, форматированием и красивой печатью) становится большим, добавление большего количества данных снизу становится довольно медленным.

0

Похоже, что используемый вами элемент управления просто не создан для количества данных, которые вы бросаете на него. Я бы подумал о создании пользовательского элемента управления. Вот некоторые вещи, которые вы могли бы принять во внимание:

  1. Когда появляется новая строка, вам не нужно повторно отображать предыдущие строки ... они не меняются, и макет не изменится из-за к новым данным.
  2. Старайтесь сохранять видимую часть плюс несколько экранов назад в памяти за раз. Это сделало бы его немного легче ... но вам нужно будет сделать свое собственное управление прокруткой, если вы хотите, чтобы пользователь мог прокручивать назад дальше, чем ваш внешний вид, и заставить все это выглядеть без проблем.
  3. Не обязательно обновлять по одной строке за раз. Когда появляются новые данные, возьмите его и обновите. Если вы получаете 10 строк очень быстро, и вы обновляете экран сразу, вы можете сэкономить на некоторых накладных расходах, делая это по очереди.

Надеюсь, это поможет.