Как заполнить Gtk :: TreeModelColumn большим набором данных без блокировки приложения - PullRequest
2 голосов
/ 07 октября 2010

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

1 Ответ

2 голосов
/ 17 февраля 2011

Существует два основных подхода. (Отказ от ответственности: я пытался предоставить пример кода, но я редко использую gtkmm - я гораздо лучше знаком с GTK в C. Однако принципы остаются теми же.)

Одним из них является использование функции ожидания - которая запускается всякий раз, когда в вашем графическом интерфейсе ничего не происходит. Для достижения наилучших результатов выполните небольшое количество вычислений в функции ожидания, например, добавив один элемент в древовидную структуру. Если вы вернете 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. Я не использовал его раньше, но здесь является примером этого. Тем не менее, вы также можете использовать C API с gtkmm, как указано здесь .

...