【问题标题】:How to fill Gtk::TreeModelColumn with a large dataset without locking up the application如何在不锁定应用程序的情况下使用大型数据集填充 Gtk::TreeModelColumn
【发布时间】:2010-10-07 07:55:46
【问题描述】:

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

【问题讨论】:

  • 程序执行过程中内容是否动态生成?如果没有,您可以在开始时预先计算 TreeModelColumn 对象。
  • 不,内容是动态生成的

标签: gtkmm treemodel large-data


【解决方案1】:

您可以采用两种通用方法。 (免责声明:我已尝试提供示例代码,但我很少使用 gtkmm - 我更熟悉 C 语言中的 GTK。但原理保持不变。)

一种方法是使用idle function - 只要您的 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。我以前没用过,here 就是一个例子。但是,您仍然可以将 C API 与 gtkmm 一起使用,正如 here 指出的那样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多