Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 当程序运行时,如何在GTK中更改标签;从一条分开的线_C_Linux_Gtk - Fatal编程技术网

C 当程序运行时,如何在GTK中更改标签;从一条分开的线

C 当程序运行时,如何在GTK中更改标签;从一条分开的线,c,linux,gtk,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的

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


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

不要从主线程外部调用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指针的类型,但我确信你明白了。小心地说,这不是100%直观的(出于某些奇怪的原因,现在的记录甚至比以前更糟糕)。@unwind可能会出现您想要使用gdk线程锁的情况。建议:将“FALSE”返回值替换为“G_SOURCE_REMOVE”。另外,就可读性而言,g_main_context_invoke()可能比g_idle_add()更好,即使在默认主上下文的情况下,它们的可读性几乎相同。@ebassi欢呼(我就像“g_SOURCE_REMOVE?没有人有最近出现的GLib”——检查显示它已经有1.5年的历史了……).我敢打赌,就算你有。嗯,也许不是Debian…;-)