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

发布于 2024-07-27 02:54:26 字数 316 浏览 2 评论 0原文

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

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

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

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

Currently I'm developing a multi-thread application. I use a TreeView to display the states of each thread, one row per thread.
There are mainly two classes:

  1. Main GUI class containing TreeView
  2. class for thread handling

Passing Gtk::TreeModel::iterator as an argument to the second class is not viable since we cannot access the elements in row in formats like row[m_Columns.m_id].
Using Glib::Dispatcher is also unavailable since the elements we change in the external function is thread-specific.

So, is there any practical method to update GUI from external functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灼疼热情 2024-08-03 02:54:26

可以在外部文件中声明列的类,并将该文件包含在 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 中的元素。

It's available to declare a class for Columns in an external file and include the file in both GUI class file and thread class file.

Like

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);
    }
};

So that if you created a Columns instance m_columns in GUI class, and passed it as a parameter to thread class, you can use

(*row)[m_columns.m_id]

to access the elements in TreeModel.

年少掌心 2024-08-03 02:54:26

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

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

我希望它有帮助。

I think you should rethink your architecture. The simpliest and safest way is for your thread to send information in a thread safe way to a class that will gather them. Then make your GUI thread read those informations, change your treevien and then refresh.

I use this paradigm in a big gtkmm/multithreaded application. Remember that it is always better to centralize your synchronization code.

I hope it helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文