Pyqt5 остановить Qthread - PullRequest
       4

Pyqt5 остановить Qthread

0 голосов
/ 19 января 2020

Я пытаюсь работать с потоками в 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_())
...