pyqt5 - убить поток при нажатии «x» - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь убить тему, когда нажимаю 'x' на моем GUI. Мой рабочий класс переходит на l oop на определенное время (просто для создания действия, которое занимает некоторое время ..). Я определил функцию остановки в своем рабочем классе, и я вызываю ее для closeEvent, но я все еще вижу вывод из for для l oop, что означает, что поток не завершен. Кроме того, я пытаюсь получить сигнал, когда поток завершен, но я не понимаю, как это сделать правильно - хотелось бы получить некоторую помощь и в этом.

Вот мой код:

Это мой GUI файл

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(200, 200)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.printBtn = QtWidgets.QPushButton(self.centralwidget)
        self.printBtn.setGeometry(QtCore.QRect(10, 50, 75, 23))
        self.printBtn.setObjectName("printBtn")

        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "GUI_Test"))
        self.printBtn.setText(_translate("MainWindow", "start thread"))

И это рабочий файл, в котором у меня также есть рабочий класс:

from PyQt5 import QtWidgets, QtCore, QtGui
from stopThreadTest import Ui_MainWindow
import sys

class Worker(QtCore.QRunnable):
    def __init__(self):
        super(Worker, self).__init__()
        self.threadactive = True

    def run(self):
        word="abcdefg123"
        if(self.threadactive):
            for i in word:
                for j in range (10000):
                    print(i)

    def stop(self):
        self.threadactive = False
        self.wait()

class ApplicationWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(ApplicationWindow, self).__init__()

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.printBtn.clicked.connect(self.btnClick) 
    def btnClick(self):
        self.threadpool = QtCore.QThreadPool()
        self.worker= Worker()
        self.threadpool.start(self.worker)  

    def closeEvent(self,event):
        self.worker.stop()                   ###<---- tried with two lines but it doesn't work...
        self.threadpool.wait(self.worker)    ###<---- tried with two lines but it doesn't work...
        print("close") 
        self.ui.centralwidget.close()

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

Что я должен сделать, чтобы эффективно убить поток на выходе, а также, чтобы получить сигнал, когда поток завершен?

...