GTK+,如何将小部件更新到主循环中?
GTK+, how to update widgets into 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());
}
g_idle_add()
是正确的方法。您会遇到分段错误,因为在空闲回调运行之前,您的字符串超出范围并被销毁。您需要手动管理空闲回调中字符串的内存;例如,使用 g_strdup()
和 g_free()
.
我的程序使用 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()
.