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