2

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

  1. 包含 TreeView 的主 GUI 类
  2. 线程处理类

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

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

4

2 回答 2

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 中的元素。

于 2009-07-16T02:23:23.740 回答
0

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

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

我希望它有所帮助。

于 2009-07-16T17:33:30.673 回答