python остановка работника через пул потоков - PullRequest
0 голосов
/ 18 марта 2020

Я строю GUI, что его целью является запуск нескольких тестов на контроллере. Мой оригинальный проект (который не приведен здесь, потому что он очень длинный, вместо этого я написал другой код, который, как мне кажется, демонстрирует, чего я хочу достичь), разделен на четыре части:

  1. Пользовательский интерфейс файл, созданный с помощью конструктора - "file A"

  2. Файл, содержащий класс. Его единственная цель - отправлять и получать сообщения на контроллер - "File B"

  3. Файл, содержащий класс. Его единственная цель - получать информацию от работника, обрабатывать ее и отправлять обратно вычисления работнику - "File C"

  4. Файл, который является рабочим файлом. Этот файл содержит функции GUI и класса Worker. - "File D" Через этот файл я в основном передаю работнику информацию, затем работник отправляет эту информацию в файл C, возвращает ее и возвращает sh обратно в 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, а не при нажатии кнопки «Пуск»)

Надеюсь, все понятно - если нет, дайте мне знать, чтобы я мог предоставить больше информации. Любое предложение или идея будет очень цениться!

РЕДАКТИРОВАТЬ: я немного изменил код, чтобы сделать его немного более похожим на мой исходный код.

...