2010-10-07 6 views
2

Мне нужно заполнить большой (возможно, не столько - несколько тысяч записей) набор данных для Gtk :: TreeModelColumn. Как мне это сделать без блокировки приложения. Можно ли перевести обработку в отдельный поток? Какие части приложения я должен защитить с помощью блокировки? Это только класс Gtk :: TreemodelColumn, или виджет Gtk :: TreeView, который он размещен, или, может быть, даже окружающий кадр или окно?Как заполнить Gtk :: TreeModelColumn с большим набором данных без блокировки приложения

+0

Является ли контент, генерируемый динамически во время выполнения программы? В противном случае вы могли бы предварительно спроектировать объект «TreeModelColumn» в начале. –

+0

нет, содержимое динамически генерируется – 2011-02-15 23:57:10

ответ

2

Существует два общих подхода, которые вы могли бы предпринять. (Отказ от ответственности: я пытался предоставить пример кода, но я редко использую 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.