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

Multithreading 如何从外部函数更新Gtk::TreeModel::Row,multithreading,gtkmm,Multithreading,Gtkmm,目前我正在开发一个多线程应用程序。我使用树状视图显示每个线程的状态,每个线程一行。 主要有两类: 包含TreeView的主GUI类 用于线程处理的类 将Gtk::TreeModel::iterator作为参数传递给第二个类是不可行的,因为我们无法以row[m_Columns.m_id]等格式访问行中的元素。 使用Glib::Dispatcher也不可用,因为我们在外部函数中更改的元素是特定于线程的 那么,有什么实用的方法可以从外部函数更新GUI吗?可以为外部文件中的列声明一个类,并将该文件同时包

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

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


    那么,有什么实用的方法可以从外部函数更新GUI吗?

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


    访问TreeModel中的元素。

    我认为您应该重新考虑您的体系结构。最简单和最安全的方法是线程以线程安全的方式将信息发送给将收集这些信息的类。然后让您的GUI线程读取这些信息,更改您的树视图,然后刷新

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


    我希望这会有帮助。

    我真的不确定这里的问题是什么。问题是GtkTreeModel本身的更新,还是您希望从与拥有GUI的线程不同的线程进行更新?对不起,我的英语很差。。。我指的是第二个。不清楚这是你的解决方案还是评论/精确性。如果是,请将其包含在问题中,而不是答案中。StackOverflow不是一个论坛…你能详细解释一下,如何找到每个线程的行吗?
    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);
        }
    };
    
    (*row)[m_columns.m_id]