python - python通过线程池停止工作人员的功能
问题描述
我正在构建一个 GUI,其目的是在控制器上运行一些测试。我的原始项目(因为它很长,所以不会带到这里,而是我写了另一个代码,我认为可以展示我想要实现的目标)分为四个部分:
通过设计器创建的 ui 文件 -
"file A"
包含类的文件。它的唯一目的是向控制器发送和接收消息 -
"File B"
包含类的文件。它的唯一目的是从工作人员那里接收信息,对其进行处理并将计算结果发回给工作人员 -
"File C"
作为操作文件的文件。该文件包含 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 中创建了一个工人,而不是单击“开始”时)
我希望一切都可以理解 - 如果不是,请告诉我,以便我提供更多信息。任何建议或想法将不胜感激!
编辑:我更改了一些代码,使其与我的原始代码更相似。
解决方案
推荐阅读
- python - 在 Python 中禁用 subprocess.Popen 回显到命令提示符窗口标题
- android - 在 Android 中接收多个特征的通知
- excel - 将变量定义为列中值的总和时,对象定义错误
- calendar - Vaadin Framework 14+ 的完整日历 4.x 未以 24 小时格式显示
- amazon-web-services - 使用度量数学时 GetMetricData Api 调用的成本?
- python - AttributeError:“SecondWindow”对象没有属性“驴”
- c# - 生产者-消费者同步问题
- python - 如何在python中连接分隔日期
- python - Python gspread,如何填充谷歌表,列表中的字典
- r - 使用 pivot_longer 和 pivot_gather 整理一个虚拟填充数据框