我的程序使用2个线程(boost :: thread),当然还有1个主循环。
问题是,我当前在每个线程的末尾更新2个小部件,而这些更新有时会引发分段错误。

我使用函数“ gtk_widget_queue_draw”将小部件更新到我的线程中。

我在网络上的某个地方看到,我们必须将所有小部件都更新到主循环中,而不是更新到线程中,所以我的问题很简单,我该怎么做?

有信号吗?

我已经尝试过使用名称为“ g_idle_add”的方法,但是它也不起作用。
看来我也可以使用gtk_thread_enter和gtk_thread_leave,但是这两个函数已被弃用。

谢谢

编辑:我差点忘了;如果我要手动更新小部件,那是因为它们不会自动更新(其中一个小部件是用cairo绘制的图表)

“ g_idle_add”似乎是执行此操作的好方法,但最终也会出现分段错误。
这是我实现此方法的方法:

在我的线程中:

g_idle_add ((GSourceFunc)update_label_monitor_cpu, &string_cpu);


函数本身:

void update_label_monitor_cpu(std::string *str)
{
    std::string tmp = *str;
    gtk_label_set_label(GTK_LABEL(label_monitor_cpu), (gchar*)tmp.c_str());
}

最佳答案

g_idle_add()是执行此操作的正确方法。您会遇到分段错误,因为在运行空闲回调之前,您的字符串超出范围并被销毁。您需要手动管理空闲回调中字符串的内存;例如,使用g_strdup()g_free()

关于c++ - GTK +,如何将小部件更新为mainloop?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30886156/

10-12 00:23
查看更多