如何在程序运行时更改GTK中的标签;从一个单独的线程

时间:2013-11-14 09:18:42

标签: c linux gtk

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

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

1 个答案:

答案 0 :(得分: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指针的类型,但我确信你会得到漂移。