我的程序使用2个线程(boost :: thread),当然还有1个mainloop。 问题是我目前在每个线程结束时更新了两个小部件,并且有时会发生更新,从而引发分段错误。
我使用函数“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());
}
答案 0 :(得分:0)
g_idle_add()
是执行此操作的正确方法。您会遇到分段错误,因为在空闲回调运行之前,您的字符串超出范围并被销毁。您需要手动管理空闲回调中字符串的内存;例如,使用g_strdup()
和g_free()
。