我正在构建一个多线程应用程序,它将显示天气数据并在C语言中自动更新。我得到了要刷新的天气数据并将其加载到变量中。我在程序运行中途更改值时遇到问题。当我使用

gtk_label_set_text(GTK_LABEL(wsrc->text2), wsrc->deg);

我明白了
(out:7604): Gtk-CRITICAL **: gtk_label_set_text: assertion `GTK_IS_LABEL (label)' failed

我该怎么做。这个调用来自main的一个独立线程,该线程循环更新天气数据。
我是否使用信号来创建更新天气数据的触发器。寻求建议:)

最佳答案

不要从它的主线程period外部调用gtk+方法。我知道有解决办法,但99.99%的时候你真的不想这么做。
你应该做的是:

/* in your other thread do this: it will make sure update_text2 will be called in
   GTK+ main thread */
g_main_context_invoke (NULL, update_text2, wsrc);

static gboolean update_text2 (gpointer userdata)
{
    my_obj* wsrc = (my_obj*) userdata;
    gtk_label_set_text(GTK_LABEL(wsrc->text2), wsrc->deg);
    return G_SOURCE_REMOVE;
}

我没有测试那段代码,也不知道wsrc指针的类型,但我相信你已经明白了。

关于c - 程序运行时如何在GTK中更改标签;来自单独的线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19973720/

10-11 21:30