如何从外部函数更新Gtk :: TreeModel :: Row

时间:2009-07-14 11:06:49

标签: multithreading gtkmm

目前我正在开发一个多线程应用程序。我使用TreeView来显示每个线程的状态,每个线程一行。 主要有两类:

  1. 包含TreeView的主GUI类
  2. 线程处理类
  3. 将Gtk :: TreeModel :: iterator作为参数传递给第二个类是不可行的,因为我们无法以行[m_Columns.m_id]等格式访问行中的元素。 使用Glib :: Dispatcher也是不可用的,因为我们在外部函数中更改的元素是特定于线程的。

    那么,有没有实用的方法从外部函数更新GUI?

2 个答案:

答案 0 :(得分:2)

可以在外部文件中为Columns声明一个类,并将该文件包含在GUI类文件和线程类文件中。

class Columns : public Gtk::TreeModel::ColumnRecord
{
public:
    Gtk::TreeModelColumn<unsigned int> m_id;
    Gtk::TreeModelColumn<Glib::ustring> m_pin;
    Gtk::TreeModelColumn<Glib::ustring> m_name;
    Gtk::TreeModelColumn<unsigned int> m_percentage;
    Gtk::TreeModelColumn<Glib::ustring> m_status;

    Columns()
    {
        add(m_id);
        add(m_pin);
        add(m_name);
        add(m_percentage);
        add(m_status);
    }
};

因此,如果您在GUI类中创建了一个Columns实例m_columns,并将其作为参数传递给线程类,则可以使用

(*row)[m_columns.m_id]

访问TreeModel中的元素。

答案 1 :(得分:0)

我认为您应该重新考虑您的架构。最简单和最安全的方法是让您的线程以线程安全的方式将信息发送到将收集它们的类。然后让你的GUI线程读取这些信息,更改你的treevien然后刷新。

我在一个大的gtkmm /多线程应用程序中使用这个范例。请记住,集中同步代码总是更好。

我希望它有所帮助。