GTK+,如何将小部件更新到主循环中

GTK+, how to update widgets into mainloop?

本文关键字:更新 循环 小部 GTK+      更新时间:2023-10-16

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

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

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

也许有信号?

我已经尝试过使用基金会"g_idle_add",但它也不起作用。似乎我也可以使用gtk_thread_enter和gtk_thread_leave但这两个函数已被弃用。

谢谢

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

"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() .