私は、C および UNIX の低レベル ソケットを使用してチャット アプリケーションに取り組んでいます。コンソール版は出来ましたが、アプリのGUIを作りたいです。GUI に GTK を使用したいと考えています。私の問題は、ソケットと GUI を「同期」する方法です。最後の GTK ステートメントとして gtk_main() を呼び出す必要があり、アプリケーション自体が無限ループになるためです。メッセージが届いたときに GUI を更新するにはどうすればよいですか?
2 に答える
一度に複数のイベントシステムがあり、スレッドが1つしかないという問題に直面しています。Gtk +には独自のイベントハンドラーが付属しており、最終的にはselect()
ユーザー入力やその他のgtkイベントでウェイクアップするイベントハンドラーになります。あなた自身があなた自身のイベント処理でネットワークを処理したいと思っています。それは通常select()
あなたのソケット上で、またはブロッキングモードでソケットを使用することで構成されています。
1つの解決策は、イベントをGtk+のイベントループに統合することです。
Gtk +select()
にソケットを監視させ、状態が変化したときに特定の関数を呼び出すことができます(データ読み取り可能)。http://developer.gnome.org/glib/2.30/glib-The-Main-Event-Loop.htmlの「新しいソースタイプの作成」のセクションを参照してください。
別の解決策は、Gtk+ネットワーク機能を使用することです。
通常、ソケットで特別なことをしたくないので、GlibIOチャネルで簡単にラップすることはできません。http://developer.gnome.org/glib/2.30/glib-IO-Channels.htmlを参照してください
3番目の解決策は、ネットワークを処理する2番目のスレッドを開始することです。たとえば、posixスレッドやGtk+スレッド機能を使用します。
一般に、GUIをアプリケーションのワーカー部分から分離することをお勧めします。ただし、チャットアプリケーションの場合、他のソリューションに勝るメリットはおそらくありません。http://developer.gnome.org/glib/2.30/glib-Threads.htmlを参照してください