上下文:
在Python中,主线程生成第二个进程(使用多处理模块),然后启动GUI(使用PyQt4)。此时主线程将阻塞,直到关闭GUI。第二个进程总是在处理,理想情况下应该以异步方式向GUI中的特定插槽发出信号。
问题:
Python和PyQt4中提供了哪些方法/工具来实现这一点,以及如何实现这一点?最好以软中断方式而不是轮询方式。
抽象地说,我能想到的解决方案是在主线程中实例化的一个“工具/处理程序”,它从GUI实例中获取可用的时隙,并与从第二个进程中获取的信号相连接,假设我向这个工具提供了一些预期或硬编码的信息。这可以实例化为第三个进程/线程。
Tags:
大家好
我希望这不会被认为是一个死尸堆,但是我认为更新Nizam的答案是好的,将他的示例添加到PyQt5中,添加一些注释,删除一些python2语法,最重要的是使用PyQt中可用的新类型的信号。希望有人觉得有用。
我们应该首先看看信号/槽如何只在一个Python进程中工作:
如果只有一个正在运行的QThread,它们就直接调用插槽。
如果信号是在另一个线程上发出的,它必须找到信号的目标线程,并在该线程的线程队列中放置一条消息/发送一个事件。该线程将在适当的时候处理消息/事件并调用信号。
所以,总是有某种内部的轮询,重要的是轮询是非阻塞的。
由multiprocessing创建的进程可以通过管道进行通信,管道为每侧提供两个connections。
Connection
的poll
函数是非阻塞的,因此我会定期用QTimer
轮询它,然后相应地发出信号。另一种解决方案可能是让线程模块(或QThread)中的
Thread
特别是使用队列的get
函数等待来自Queue
的新消息。有关详细信息,请参阅multiprocessing的管道和队列部分。。下面是一个在另一个
Process
中启动Qt GUI的示例,同时还有一个Thread
负责监听Connection
和特定消息,关闭GUI,然后终止进程。这是一个Qt应用程序示例,演示如何将信号从子进程发送到主进程中的插槽。我不确定这是正确的方法,但它是有效的。
我将过程区分为母亲和孩子,因为单词父在Qt上下文中使用。
母进程有两个线程。母进程的主线程通过
multiprocessing.Queue
向子进程发送数据。子进程通过multiprocessing.Pipe
向母进程的第二个线程发送已处理的数据和要发送的信号的签名。母进程的第二个线程实际上发出了信号。Python2.X,PyQt4:
为了方便起见,Python 3.X,PySide:
相关问题 更多 >
编程相关推荐