Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to properly quit a QThread in PyQt5 when using moveToThread

I am trying to quit a thread after it is done processing. I am using moveToThread. I'm trying to quit the worker thread from the main thread by calling self.thread.quit() in the slot. And that's not working.

I've found several examples of starting the thread using moveToThread, such as this one. But I can't find how to quit one.

from PyQt5.QtCore import QObject, QThread
from PyQt5.QtCore import pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QMainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        print("Base init")
        self.start_thread()

    @pyqtSlot(int)
    def onFinished(self, i):
        print("Base caught finished, {}".format(i))
        self.thread.quit()
        print('Tried to quit thread, is the thread still running?')
        print(self.thread.isRunning())

    def start_thread(self):
        self.thread = QThread()
        self.w = Worker()
        self.w.finished1[int].connect(self.onFinished)
        self.w.moveToThread(self.thread)
        self.thread.started.connect(self.w.work)
        self.thread.start()

class Worker(QObject):
    finished1 = pyqtSignal(int)

    def __init__(self):
        super().__init__()
        print("Worker init")

    def work(self):
        print("Worker work")
        self.finished1.emit(42)


if __name__ == "__main__":
    import sys
    from PyQt5.QtWidgets import QApplication

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()

sys.exit(app.exec_())

This is the output from all my print functions (without the color of course):

Base init
Worker init
Worker work
Base caught finished, 42
Tried to quit thread, is the thread still running?
True
like image 886
squirtgun Avatar asked Sep 14 '25 18:09

squirtgun


1 Answers

Try running your script multiple times. Is the result of the call to self.thread.isRunning() always the same? Try adding a call to time.sleep(1) before checking if the thread is still running. Notice any difference?

Remember that you are making a call from the main thread of your program, to another thread, which is by definition asynchronous. Your program will not wait to make sure self.thread.quit() has completed before executing the next instructions.

like image 198
user3419537 Avatar answered Sep 17 '25 11:09

user3419537