1

我正在构建一个多线程应用程序,它将显示天气数据并在 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 循环以更新天气数据的单独线程。

我是否使用信号来创建触发器来更新天气数据。寻求建议:)

4

1 回答 1

2

不要从它的主线程外部调用 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 指针的类型,但我相信你明白了。

于 2013-11-14T12:35:51.037 回答