GTK +,如何将小部件更新为mainloop?

躯体性的

我的程序使用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());
}
Andlabs

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章