首页 > 解决方案 > python通过线程池停止工作人员的功能

问题描述

我正在构建一个 GUI,其目的是在控制器上运行一些测试。我的原始项目(因为它很长,所以不会带到这里,而是我写了另一个代码,我认为可以展示我想要实现的目标)分为四个部分:

  1. 通过设计器创建的 ui 文件 -"file A"

  2. 包含类的文件。它的唯一目的是向控制器发送和接收消息 - "File B"

  3. 包含类的文件。它的唯一目的是从工作人员那里接收信息,对其进行处理并将计算结果发回给工作人员 -"File C"

  4. 作为操作文件的文件。该文件包含 GUI 和 Worker 类的功能。-"File D"通过这个文件,我基本上将信息传递给工作人员,然后工作人员将此信息发送到文件 C,将其取回,然后将其推回 GUI。如前所述,与控制器的所有通信都是通过工人进行的,使用写在"File C"

现在我正在为此苦苦挣扎:假设我开始进行测试,但我想在中间停下来。我不知道该怎么做。

下面是一个简短的代码,与我上面描述的想法相似:

runstop.py 就像"File A",包含设计器输出:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(311, 123)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(70, 50, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(160, 50, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.lbl = QtWidgets.QLabel(self.centralwidget)
        self.lbl.setGeometry(QtCore.QRect(70, 80, 75, 23))
        self.lbl.setObjectName("lbl")

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "Start Timer"))
        self.pushButton_2.setText(_translate("MainWindow", "Stop Timer"))

EX.py就像"File C"- 基本上将一些信息发回给工人:

from datetime import datetime
from PyQt5 import QtTest
class EX():
    def __init__(self,lbl): 
        self.lbl=lbl
    def time(self):
        QtTest.QTest.qWait(1000)
        now = datetime.now()
        current_time = now.strftime("%H:%M:%S")
        self.lbl.setText(current_time)

runstopoper.py就像"File D"- 项目的操作部分,也包含工人:

from runstop import Ui_MainWindow
from EX import EX
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
try:
    import queue
except ImportError:
    import Queue as queue

class Worker(QtCore.QRunnable):
    def __init__(self,q,lbl):
        super(Worker, self).__init__()
        self.Q=q
        print("worker up")
        self.ex=EX(lbl)
    def gettime(self):
        self.ex.time()

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.threadpool=QtCore.QThreadPool()        
        self.Q=queue.Queue()
        self.ui.pushButton_2.setEnabled(False)
        self.worker=Worker(self.Q,self.ui.lbl)
        self.ui.pushButton.clicked.connect(self.startTime)

    def startTime(self):
        print("Started!")
        self.ui.pushButton.setEnabled(False)
        self.ui.pushButton_2.setEnabled(True)
        self.timer = QtCore.QTimer()
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.updateTime)
        self.timer.start()

    def updateTime(self):
        self.worker.gettime()
    def stopTime(self):
        print("stop?")
        ###how do I stop without stopping timer?###
    def closeEvent(self,event):
            sys.exit()

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

所以,我的问题是当我点击停止时如何停止工作人员而不必停止QTimer?我想也许我可以用QThreadPool来阻止它,但不知道怎么做。另外,我不想“杀死”整个工人,因为我希望可以选择再次启动计时器(如果不创建新工人是不可能的,但是在 init 中创建了一个工人,而不是单击“开始”时)

我希望一切都可以理解 - 如果不是,请告诉我,以便我提供更多信息。任何建议或想法将不胜感激!

编辑:我更改了一些代码,使其与我的原始代码更相似。

标签: pythonpyqt5threadpoolworker

解决方案


推荐阅读