我需要在Gtk :: TreeModelColumn中填入一个大的(可能不是那么多 - 几千个条目)数据集。如何在不锁定应用程序的情况下执行此操作。将处理放入单独的线程是否安全?那么我需要用锁来保护应用程序的哪些部分呢?它只是放置在Gtk :: TreemodelColumn类或Gtk :: TreeView小部件中,或者甚至可以围绕框架或窗口吗?
答案 0 :(得分:2)
您可以采取两种常规方法。 (免责声明:我试图提供示例代码,但我很少使用gtkmm - 我对C语言中的GTK更熟悉。但原则保持不变。)
一种是使用idle function - 只要GUI中没有发生任何事情就会运行。为获得最佳效果,请在idle函数中执行少量计算,例如向treeview添加一个项目。如果从idle函数返回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就是一个例子。但是,您仍然可以使用带有gtkmm的C API,如here所述。