我需要向 Gtk::TreeModelColumn 填写一个大的(可能不是那么多 - 几千个条目)数据集。如何在不锁定应用程序的情况下做到这一点。将处理放入单独的线程中是否安全?那么我必须用锁保护应用程序的哪些部分?它只是 Gtk::TreemodelColumn 类,还是它所在的 Gtk::TreeView 小部件,甚至可能是围绕框架或窗口?
user283145
问问题
370 次
1 回答
2
您可以采用两种通用方法。(免责声明:我尝试提供示例代码,但我很少使用 gtkmm - 我更熟悉 C 语言中的 GTK。但是,原理保持不变。)
一种是使用空闲功能- 只要您的 GUI 中没有任何事情发生,它就会运行。为了获得最佳结果,请在空闲函数中进行少量计算,例如将一项添加到树视图中。如果您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 一起使用,正如此处指出的那样。
于 2011-02-16T22:45:56.873 回答