現在、Python asyncore と pyqt4 を使用してネットワークを学習しようとしています。
私は小さなサーバーをコーディングしました。このサーバーは基本的にポートをリッスンし、受信したすべてのメッセージを送信者に再送信します。
qtsQApplication.exec_()
とasyncore.loop()
は両方とも返されない関数であるため、1 つのスレッドで両方を開始できなかったので、別asyncore.loop()
のデーモン スレッドを見つめました。
サーバー クラス ( から派生asyncore.dispatcher
) が接続を確立または切断するか、メッセージを送受信するときはいつでも、ウィンドウ クラス ( から派生QtGui.QMainWindow
) のメソッドを呼び出し、情報をQPlainTextEdit
.
ただし、マウスでテキストをマークしない限り、テキストは表示されません。
Python コンソールに次のエラー メッセージが表示されます。
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
これは別のスレッドからqt関数を呼び出すことによって引き起こされる可能性があり、プレーンな関数呼び出しの代わりにシグナルとスロットを使用すると問題が解決する可能性があることをいくつかのフォーラムで読みましたが、シグナルも試しましたが、まだこのエラーが発生します。
それで、(それが本当に私の問題の原因である場合)別のスレッドからqtオブジェクトのメソッドを呼び出す正しい方法は何ですか?
詳細情報を編集: asyncore.loop() 呼び出しは子スレッドにあり、実際にはブロックされていませんが、asyncore.loop() の実行時のみ、サーバー クラス (asyncore.dispatcher) がネットワークを実行できます。したがって、asyncore.loop() の実行時に、サーバー クラスのメソッドが asyncore.loop() (= 子スレッド) によって呼び出され、これらの中で、メイン スレッドで実行されているウィンドウ クラスにシグナルを送信しようとしました。
EDIT:私は今それが働いているようです、私は私のコードにいくつかのエラーがありました.
編集:小さな例: http://paste2.org/p/635612 (リンク切れ)