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 に答える