Мне нужно заполнить большой (возможно, не столько - несколько тысяч записей) набор данных для Gtk :: TreeModelColumn. Как мне это сделать без блокировки приложения. Можно ли перевести обработку в отдельный поток? Какие части приложения я должен защитить с помощью блокировки? Это только класс Gtk :: TreemodelColumn, или виджет Gtk :: TreeView, который он размещен, или, может быть, даже окружающий кадр или окно?Как заполнить Gtk :: TreeModelColumn с большим набором данных без блокировки приложения
ответ
Существует два общих подхода, которые вы могли бы предпринять. (Отказ от ответственности: я пытался предоставить пример кода, но я редко использую gtkmm - я больше знаком с GTK в C. Однако принципы остаются прежними.)
Один из них - использование idle function - запускается всякий раз, когда ничего не происходит в вашем графическом интерфейсе. Для достижения наилучших результатов сделайте небольшое количество вычислений в режиме ожидания, например добавление одного элемента в ваше дерево. Если вы возвращаете true
из функции простоя, то она вызывается снова всякий раз, когда доступно больше времени обработки. Если вы вернетесь false
, он не будет снова вызван. Хорошая часть простаивающих функций заключается в том, что вам не нужно ничего блокировать. Таким образом, вы можете определить функцию простоя, как это:
bool fill_column(Gtk::TreeModelColumn* column)
{
// add an item to column
return !column_is_full();
}
Затем запустите процесс так:
Glib::signal_idle().connect(sigc::bind(&fill_column, column));
Другой подход заключается в использовании потоков. В C API это будет связано с gdk_threads_enter()
и друзьями, но я понимаю, что правильный способ сделать это в gtkmm - это использовать Glib::Dispatcher
. Я не использовал его раньше, но это пример here. Тем не менее, вы также можете использовать C API с gtkmm, как указано here.
Является ли контент, генерируемый динамически во время выполнения программы? В противном случае вы могли бы предварительно спроектировать объект «TreeModelColumn» в начале. –
нет, содержимое динамически генерируется – 2011-02-15 23:57:10