如何使用大型数据集填充Gtk :: TreeModelColumn而不锁定应用程序

时间:2010-10-07 07:55:46

标签: gtkmm treemodel large-data

我需要在Gtk :: TreeModelColumn中填入一个大的(可能不是那么多 - 几千个条目)数据集。如何在不锁定应用程序的情况下执行此操作。将处理放入单独的线程是否安全?那么我需要用锁来保护应用程序的哪些部分呢?它只是放置在Gtk :: TreemodelColumn类或Gtk :: TreeView小部件中,或者甚至可以围绕框架或窗口吗?

1 个答案:

答案 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所述。