Я пытаюсь работать с потоками в pyqt5. Намерение состоит в том, чтобы запустить мой GUI и запустить qthread с вычислением со значениями из файла XML. Первый расчет (и при каждом вычислении новый поток) начинается после того, как программа установила GUI, когда вы нажмете кнопку sh для вычисления и если вы выберете новый XML -файл. Это все работает отлично. Моя проблема - остановить поток. Например, я выбираю новый XML -файл, начинается поток, и в моем файле отсутствует одно значение. Я хочу, чтобы GUI продолжал работать и выходил только из потока с сообщением об ошибке, которое показывает отсутствующий параметр. Я проверяю каждое значение из XML -файла в моей ветке следующим образом:
value_1= xml.getParameterSet('base').getParameterValue('value_1')
Error.checkValue(value_1)
value_2 отсутствует в моем xml -файле, например. Если мой параметр value_2 == None, мой класс ошибок должен выйти из потока.
value_2= xml.getParameterSet('base').getParameterValue('value_2') # this value is missing
Error.checkValue(value_2)
counter = value_2 * 5
Дело в том, что поток игнорирует остановку. Таким образом, следующая часть (здесь: «counter») уже начинается и возвращает ошибку при использовании объекта нетипичного типа. Следующий код показывает, как я пытаюсь остановить свою тему. Я использую терминатор, потому что thread.quit () особенно подходит для выхода из циклов, я думаю, и моя функция вычислений запускается только один раз от начала до конца.
class Error():
def checkValue(self, value):
if value == none:
print("\nThe calcualtion is terminated!")
print("\n ----------------------------------------")
print("\n ----------------------------------------")
thread.signal_error.emit("ERROR: Parameter is missing") # send signal to GUI(mainthread) to show errormessage with QtWidgets.QMessageBox()
thread.terminate()
thread.wait()
Даже если завершение не является хорошим способом остановить поток, он должен по крайней мере что-то сделать !? Я знаю, что мой поток работает правильно, потому что он отправляет сигнал на GUI и показывает окно сообщения. Он просто игнорирует остановку в случае ошибки. Должен ли я использовать флаги для прерывания потока?
from PyQt5 import QtCore, QtGui, QtWidgets
from GUI import Ui_MainWindow
import sys
class Error():
worker = None
thread = None
def quitProgramm():
print("\nThe Programm is terminated!")
print("\n -------------------------------------")
print("\n -------------------------------------")
self.thread.terminate()
self.thread.wait()
def checkValue(self,parameter):
if parameter == None:
self.worker.signal_error.emit("ERROR: Paramter is missing")
self.quitProgramm()
class Thr(QtCore.QObject):
ui = None
def __init__(self):
super().__init__()
self.start_thread()
def start_thread(self):
worker = Worker(1)
thread = QThread(parent=self)
worker.moveToThread(thread)
Error.thread = thread
Error.worker = worker
worker.signal_error.connect(self.ui.error_message) # send error_message
thread.started.connect(worker.work)
thread.start() # this will emit 'started' and start thread's event loop
class worker(QtCore.QObject):
signal_error = QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
def work(self):
value_1 = 5
Error.checkValue(value_1)
value_2 = None
Error.checkValue(value_2) # send signal; won't stop the thread
example = value_2 * 5 # can't calculate, because value_2 is none
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # create MainWindow
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
Thr.ui = ui
thread = Thr() # start firs calculation
sys.exit(app.exec_())