如何从PyQt正确执行多处理?

时间:2017-12-05 08:31:53

标签: python multiprocessing

我创建一个按钮并尝试在单击按钮时运行多处理,

但是UI被阻止了。我希望进程能够在backgorund中运行。

我该如何解决?

from PySide2 import QtCore,QtGui,QtWidgets
import sys
import multiprocessing
from threading import Timer
class TTT(multiprocessing.Process):
    def __init__(self):
        super(TTT, self).__init__()
        self.daemon = True
    def run(self):
        while True:
            t = Timer(5, self.doSomething)
            t.start()
            t.join()

    def doSomething(self):
        try:
            print('123')
        except Exception as e:
            print(e)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        btn = QtWidgets.QPushButton('run process')
        btn.clicked.connect(self.create_process)
        self.setCentralWidget(btn)

    def create_process(self):
        QtWidgets.QMessageBox.information(self,'hhh','hhh')
        t = TTT()
        t.start()
        t.join()

if __name__=="__main__":
    app=QtWidgets.QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

3 个答案:

答案 0 :(得分:2)

我从未使用多处理,但是文档说join()方法会阻止调用者直到完成。将该方法置于无限循环中将永远阻止调用者(UI)。

答案 1 :(得分:2)

BendegúzSzatmári已经回答了主要问题。

我只是想让你知道在大多数用法中使用Process并不是最好的主意。 不同的进程不会与您的程序共享内存。你不能像不同的线程那样容易地控制它们。

以下是如何启动end stop不同线程的简单示例。

from PyQt5 import QtWidgets
from PyQt5.QtCore import *
import sys
import time


class TTT(QThread):
    def __init__(self):
        super(TTT, self).__init__()
        self.quit_flag = False

    def run(self):
        while True:
            if not self.quit_flag:
                self.doSomething()
                time.sleep(1)
            else:
                break

        self.quit()
        self.wait()

    def doSomething(self):
        print('123')


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.btn = QtWidgets.QPushButton('run process')
        self.btn.clicked.connect(self.create_process)
        self.setCentralWidget(self.btn)

    def create_process(self):
        if self.btn.text() == "run process":
            print("Started")
            self.btn.setText("stop process")
            self.t = TTT()
            self.t.start()
        else:
            self.t.quit_flag = True
            print("Stop sent")
            self.t.wait()
            print("Stopped")
            self.btn.setText("run process")


if __name__=="__main__":
    app=QtWidgets.QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

答案 2 :(得分:0)

这是一个很好的策略:

https://elsampsa.github.io/valkka-examples/_build/html/qt_notes.html#python-multiprocessing

特点:

  • 您可以从多进程发送Qt信号
  • 您可以将Qt信号发送到多进程