0

udp を使用して C/S アプリケーションを作成しましたが、エラーが発生し続けます。これは、スレッドの使用方法に関係があると思われます。

クライアント プログラムが開始されると、まずログイン ウィンドウが初期化され、新しいスレッドが開始されてサーバーからの応答がリッスンされます。ユーザー名とパスワードを送信すると、新しいスレッドは正しい情報を送信したかどうかを示すメッセージを受け取ります。存在する場合、スレッドはメイン GUI ウィンドウを初期化します。しかし、奇妙なエラーが発生します。

Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0

また

python: Fatal IO error 0 (Success) on X server :0.0

ここで同様の質問を見つけましたが、解決されていません。

GUI はメイン スレッドでのみ操作する必要があると言う人もいますが、そうではないという人もいます。

また、そのリッスンスレッドでウィンドウを初期化するコードを使用gdk_threads_enter()gdk_threads_enter()てみました。gtk_main()しかし、うまくいかなかったようです。

私はスレッドについてあまり知らないので、どこが間違っているかを指摘するときは辛抱強く待ってください。

ありがとう。

4

2 に答える 2

1

これらのエラー メッセージは、GTK ロックを適切に保持していない場合にときどき表示されることがわかりました。

元の呼び出し囲み、GTK 関数へのすべての呼び出しを囲む必要がgdk_threads_enter()あります。gdk_threads_leave()gtk_main()

  • 呼び出し元のスレッドの外gtk_main()
  • ただし、シグナル、アイドル、またはタイムアウト ハンドラでは使用できません。

私が理解しているように、この使用法は廃止されつつあり、GTK の将来のバージョンでは、メインスレッドからのみ GTK を操作できるようになります。

于 2012-07-16T08:51:10.297 に答える
0

GTK ウィンドウはメイン スレッドからのみ操作する必要があるのは事実です。

とは言っても、一部のアーキテクチャ (特に GNU/Linux) では、 /でグローバル ロックを適切に使用すれば、別のスレッドから GTK ウィンドウを操作できます。キーワードは「適切に」ですが、それは思ったほど簡単ではありません。gdk_threads_enter()gdk_threads_leave()

とは言っても、一部のアーキテクチャ (特に MS-Windows) では、単純なプログラムでは機能するように見えて、より複雑なプログラムでは悲惨に失敗する場合があります。

あなたの質問については、あなたはそれを言っていませんが、どこかで Python を使用しているようですが、場所は言っていません... Python とネイティブ スレッドを混在させることも、おそらくあまり良い考えではありません。

于 2012-07-12T14:41:16.650 に答える