我目前正在尝试学习使用Python asyncore和pyqt4的网络。
我编码了一个小型服务器,该服务器基本上在某个端口上侦听,然后将收到的所有消息重新发送给发送方。
由于这两个qtsQApplication.exec_()
和asyncore.loop()
都是永不返回的函数,因此我无法在一个线程中同时启动它们,因此我盯着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-
functions引起的,并且使用信号和插槽而不是简单的函数调用可以解决此问题,但是我也尝试过信号,但仍然会收到此错误。
那么,(如果这确实是我的问题的原因)从另一线程调用qt对象的方法的正确方法是什么?
编辑更多信息:
asyncore.loop()调用位于子线程中,它实际上并没有阻塞,但仅在asyncore.loop()运行时,我的Server类(asyncore.dispatcher)才能进行联网。因此,在asyncore.loop()运行时,我的Server类的方法被asyncore.loop()(=子线程)调用,在这些方法中,我试图向运行在主线程中的window类发出信号
编辑: 似乎我现在就可以正常工作,我的代码中有一些错误,现在一切都按信号正常工作。
编辑:一个 小例子:http
:
//paste2.org/p/635612
(死链接)
看来您正在尝试从主线程以外的其他线程访问QtGui类。像在其他一些GUI工具包(例如Java
Swing)中一样,这是不允许的。在“线程和QObjects”网页上:
尽管QObject是可重入的,但GUI类(尤其是QWidget及其所有子类)不是可重入的。它们只能在主线程中使用。
一种解决方案是使用信号和插槽在主线程(GUI对象所在的位置)和辅助线程之间进行通信。基本上,您在一个线程中发出信号,该信号通过另一线程传递给QObject。我上面链接的页面对此进行了很好的讨论。实际上,有关Qt中的线程支持的整个部分都是不错的读物。
您可能会遇到的一个潜在问题是,通常情况下,要获得完整的信号和插槽支持跨线程工作,您需要使用QThread::exec()
(或等效的PyQt)在子线程中启动事件循环,以便可以将信号传递到插槽中。生活在那里的QObject。就您而言,听起来您正在对进行阻塞调用asyncore.loop()
,这将阻止您执行此操作。但是,如果您只需要在一个方向(从子线程到主线程中的小部件)发出信号,我认为您不会遇到问题。
1):单线程应用程序只会在用户的CPU上使用1个线程吗?提供更多的线程会使用多个CPU内核吗?如果声明的线程比用户的CPU多,会发生什么?
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有;可能有些问题对应的答案也有;也可能有些各位网友也都看过。但是本文写作的重心就是所
线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。
互斥锁 互斥锁的本质是当一个 goroutine 访问的时候,其它 goroutine 都不能访问 这样就能实现资源同步,但是在避免资源竞争的同时也降低了程序的并发性能,程序由原来的并发执行变成了串行 案例 有一个打印函数, 用于逐个打印字符串中的字符,有两个人都开启了goroutine去打印 如果没有添加互斥锁,那么两个人都有机会输出自己的内容 如果添加了互斥锁,那么会先输出某一个的,输出完毕之
如图所示, 位置 2 和位置3 为什么可以访问 位置1 (也就是主线程)的 point 局部变量 ? 毕竟 位置 2 和位置3 是另外两个线程啊 !! 当我加上 第10行代码后,thread1 和 thead2 中都不能访问主线程中的point 了。我知道这是内部类的“事实最终变量” 的限制。 如下图所示,就是我不理解的地方。(在 “栈内存” 层面) 我的猜测:之所以 thread1 和 trea
多任务是一个操作系统可以同时执行多个程序的能力。基本上,操作系统使用一个硬件时钟为同时执行的每个程序配置「时间片段」。如果时间片段够小,并且机器也没有由于太多的程序而超出负荷时,那么在使用者看来,所有的这些程序似乎在同时执行着。 多任务并不是什么新的东西。在大型计算机上,多任务是必然的。这些大型主机通常有几十甚至几百个终端机和它连结,而每个终端机使用者都应该感觉到他或者她独占了整个计算机。另外,大
我正在尝试将一系列参数传递给不同的c线程。当NumThreads == 1时,程序运行良好,但是当NumThreads 创建线程的位置: 并且成员函数被调用: 来自前三个线程的控制台输出:{ 所以ID和样本索引被正确地传递给了线程,但是srcPoint怎么对所有三个线程都是相同的呢?!?
各位大佬请教一个问题,当我实现任务队列时rpushTasksQueue始终要比我上限少一个,比如我设定的上限是3,然后他2执行完就结束了,求救