私はGTKを使用してかなり簡単にC applicationを構築していますが、いくつかのブロックIOを実行する必要があり、これによりGUIの更新がトリガーされます。これを行うためには、私は右のようなgtk_main()
前に新しいpthread
を開始:pthread
は、いくつかのデータを読み取るとGTKでのスレッディング問題
/* global variables */
GMainContext *mainc;
/* local variables */
FILE *fifo;
pthread_t reader;
/* main() */
mainc = g_main_context_default();
pthread_create(&reader, NULL, watch_fifo, argv[argc-1]);
gtk_main();
、それはそうのようなGUIを更新します。
set_icon
が
ある
g_main_context_invoke(mainc, set_icon, param);
gboolean set_icon(gpointer data)
{
char *p = (char*)data;
gtk_status_icon_set_from_icon_name(icon, p);
return FALSE;
}
これはほとんどすべての場合に機能しますが、何度も何度もこの不思議なエラーメッセージが表示されます。
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry about that. mktrayicon: xcb_io.c:274: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.
g_main_context_invoke
は、スレッドの問題を避けるためのものだと思いましたか?グーグルでやっているうちに、私はgdk_threads_init
、gdk_threads_enter
と友だちに出くわしましたが、それらはすべて廃止されているようですね?私は、GTKのドキュメントでは、すべてのGUIの更新がメインスレッドで実行されるべきだと言いますが、これはIOをブロックするだけでよく、スレッド間に複雑な通信メカニズムを構築する必要はありません。
そして、私の質問は、どうすればこの問題に正しく対処すればよいのでしょうか?
EDIT:完全なコードは、here EDIT2を見ることができます:@のptomatoの回答に基づいて更新したように、私はGThread
秒に移動し、gdk_threads_add_idle()
を使用してthisに見られるようにコミットが、問題がまだ存在してきました。
あなたはいくつかのコードを用意していますか?かなり長い間gtk +を使用していましたが、_never_はこの問題に遭遇しました。 – drahnr
コード全体が[GitHub](https://github.com/jonhoo/mktrayicon) )をポストにリンクしています。 –
ああ、感謝しなかった! – drahnr