Есть основная программа - интерфейс на PyQt4.8, в ней при нажатии на кнопу запускается функция start(), внутри которой выполняется долгий научный расчёт. Так как расчёт выполняется иногда очень долго (часы), то я сделал ProgressBar с кнопкой, с нажатием по которой расчёт бы заканчивался. Расчёт я вынес в отдельный QThread, но у меня не получается его остановить.
def start(self): #Много подготовительных вычислений #Вычислительный поток self.worker = MyWorker() self.thread =QtCore.QThread() self.worker.moveToThread(self.thread) #Коннекты self.progressWindow.canceled.connect(self.threadKill) self.thread.finished.connect(self.threadFinished) self.connect(self.thread, QtCore.SIGNAL('started()'), self.worker.doWork) self.connect(self.worker, QtCore.SIGNAL('workFinished()'), self.thread, QtCore.SLOT('quit()')) print('Star', time()) self.progressWindow.show() self.thread.start()
Класс, где выполняется расчёт:
class MyWorker(QtCore.QObject): def doWork(self): print('doWork') #Расчёт for i in range(1, 21): sleep(1) print('Сон', i) self.emit(QtCore.SIGNAL('workFinished()')) print('Сигнал')
Методы обработчики из класса Виджета, где расположена кнопка
def threadKill(self): """Принудительное завершение вычислительного потока""" #Завершаем вычислительный поток print('Kill', time()) self.thread.terminate() def threadFinished(self): """Завершение вычислительного потока""" print('Finish', time())
Вы итоге получаю, следующий вывод:
Start 1558245955.3263943 doWork Сон 1 Сон 2 Сон 3 Сон 4 Сон 5 Kill 1558245960.887371 Сон 6 Сон 7 Сон 8 Сон 9 Сон 10 Сон 11 Сон 12 Сон 13 Сон 14 Сон 15 Сон 16 Сон 17 Сон 18 Сон 19 Сон 20 Сигнал Finish 1558245975.3528898
Буду рад любой помощи.