我正在嘗試使用Python asyncore和pyqt4學習網絡。QObject(QPlainTextEdit)&多線程問題
我編寫了一個小型服務器,它基本上監聽某個端口,並重新發送收到發件人的所有消息。
由於qts QApplication.exec_()
和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()的運行時期間,我的Server類的方法被asyncore.loop()(= child thread)調用,並且在這些函數中我嘗試向主線程中運行的窗口類發送信號
編輯:好像我現在工作,我的代碼有一些錯誤,一切都按照預期的信號工作。
編輯:小例子:http://paste2.org/p/635612(死鏈接)
你能發表一個解釋或工作解決方案的片段嗎?它肯定會在未來幫助其他人解決同樣的問題。 =) – 2010-01-27 16:10:30