我正在尝试使用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