Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3-Pyqt5如何通过异常或按退出按钮结束线程中的循环_Python_Multithreading_Python 3.x_Loops_Pyqt5 - Fatal编程技术网

Python3-Pyqt5如何通过异常或按退出按钮结束线程中的循环

Python3-Pyqt5如何通过异常或按退出按钮结束线程中的循环,python,multithreading,python-3.x,loops,pyqt5,Python,Multithreading,Python 3.x,Loops,Pyqt5,我是python和pyqt新手,有一个问题我还没有解决: 下面的程序在其GUI中有3个while循环,从一个值运行到零。我将这些循环放在单独的qthread中,以便同时执行它们。 问题:如果我按下窗口的退出按钮,循环将继续,并仍在控制台中运行,线程数将消失(这就是为什么我知道它们仍在运行)。如何通过退出程序来停止此操作 对不起,代码太乱了。正如我所说,python对我来说是新事物 主要类别: class Application(QtWidgets.QMainWindow): counte

我是python和pyqt新手,有一个问题我还没有解决: 下面的程序在其GUI中有3个while循环,从一个值运行到零。我将这些循环放在单独的qthread中,以便同时执行它们。 问题:如果我按下窗口的退出按钮,循环将继续,并仍在控制台中运行,线程数将消失(这就是为什么我知道它们仍在运行)。如何通过退出程序来停止此操作

对不起,代码太乱了。正如我所说,python对我来说是新事物

主要类别:

class Application(QtWidgets.QMainWindow):
    counter = pyqtSignal(int)
    counting = False
    #QtWidgets.QWidget

    def __init__(self, name):
        super(Application, self).__init__()
        self.setupUi(self)
线程中的一个循环:

#Start des Reinigungsprozesses Becken 1
def becken1start(self):
    self.sekunden1 = value1 * 60
    if self.pushButton1.isChecked():
        if  value1 == 0:
            self.pushButton1.setChecked(False)
            self.showMessageBox('Bitte Laufzeit der Reinigung wählen')
        else:
            thread = threading.Thread(target=self.run1)
            thread.start()
            print("Active Threads :", threading.activeCount())
    else:
        pass

#Ausführen des Threads für den Countdown Becken 1
def run1(self):
    while self.sekunden1 > -1:
        sleep(1)
        GPIO.setup(2, GPIO.OUT) 
        GPIO.output(2, GPIO.LOW)
        self.dial1.setDisabled(True)
        self.lcdNumber1.display(self.sekunden1)
        self.pushButton1.setText("läuft")
        #QtWidgets.qApp.processEvents()
        print("Active Threads :", threading.activeCount())
        self.sekunden1-=1
        if self.pushButton1.isChecked():
            continue
        else:
            break
    self.dial1.setDisabled(False)
    self.pushButton1.setText("BECKEN 1")
    self.lcdNumber1.display(value1)
    self.pushButton1.setChecked(False)
    GPIO.output(2, GPIO.HIGH)
退出部分:

if __name__ == "__main__":
    import sys
    sys._excepthook = sys.excepthook
    def my_exception_hook(exctype, value, traceback):
        print(exctype, value, traceback)
        sys._excepthook(exctype, value, traceback)
        sys.exit()

    sys.excepthook = my_exception_hook
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Application(threading.Thread)
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

将线程设为守护进程意味着如果主线程死亡,线程将无法继续运行。

感谢您的快速回答。酷!遗憾的是,你的方法行不通。。。也许,我应该提到函数run1和beckenstart1在主类中。。。。另外:我必须导入任何东西才能使用守护进程吗?
#Start des Reinigungsprozesses Becken 1
def becken1start(self):
    self.sekunden1 = value1 * 60
    if self.pushButton1.isChecked():
        if  value1 == 0:
            self.pushButton1.setChecked(False)
            self.showMessageBox('Bitte Laufzeit der Reinigung wählen')
        else:
            thread = threading.Thread(target=self.run1)
            thread.daemon = True 
            thread.start()
            print("Active Threads :", threading.activeCount())
    else:
        pass