在UI界面程序中,使用到多进程与多线程是很常见的场景,有时候我们需要将一些耗时的操作放在其他的线程或者进程中,避免卡死主线程。而且利用多线程加Qt的信号槽机制我们可以在子进程中实现事件监听,实时监测进程间的通信。之前一直对线程和进程的理解不太深刻,借着这次机会好好理解了一下多线程与多进程,等之后在接触带锁的多线程模式。
multiprocess是python的一个库,由于python的跨平台特性,我们可以很容易在不同平台中使用多线程,而不用关心底层的实现。对于进程间的通信有Queue和Pipe两种方法,具体可查看python的官方文档multiprocess。
示例代码如下,我们在main函数中生成一个消息队列,并启动主界面的事件循环,然后我们将button的click信号与开启一个子进程的槽函数绑定,并利用另一个信号槽给消息队列中填充数据。此时我们需要在子进程中实现一个事件监听,来实时接收信号,实现方式是在子进程中开一个线程,然后启动一个死循环来监听队列消息,以此实现实时接收信号。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import threading as th
import multiprocessing as mp
import quite
from PySide.QtCore import Signal,QObject,QCoreApplication,QEvent
__author__ = 'WingC'
class SignalWrapper(QObject):
signal = Signal(object)
class main_ui(quite.DialogUiController):
def __init__(self):
super().__init__(ui_file='untitled.ui')
self.q = mp.Queue()
#开启子进程
self.button('test').clicked.connect(self.start_slave_ui)
#主进程发送数据
self.button('test2').clicked.connect(self.input)
def st