Я пытаюсь убить тему, когда нажимаю '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_())
Что я должен сделать, чтобы эффективно убить поток на выходе, а также, чтобы получить сигнал, когда поток завершен?