2

我需要向 Gtk::TreeModelColumn 填写一个大的(可能不是那么多 - 几千个条目)数据集。如何在不锁定应用程序的情况下做到这一点。将处理放入单独的线程中是否安全?那么我必须用锁保护应用程序的哪些部分?它只是 Gtk::TreemodelColumn 类,还是它所在的 Gtk::TreeView 小部件,甚至可能是围绕框架或窗口?

4

1 回答 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 回答