Прекращение работы Python из-за программы с PyQt5 (Используется QThread и MoveToThread). Как решить данную проблему?

Пытаюсь освоить многопоточность PyQt, но пока кое-что не получается. Подскажите, по какой причине во время исполнения данного фрагмента кода Python прекращает работу. Или хотя бы может поможете правильно организовать многопоточную работу программы.

from design import MainWindow
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QObject, QThread
import sys
import algorithm


class AlgThread(QObject):
    def __init__(self, font_name, lang, save_path, open_):
        super(AlgThread, self).__init__()
        self.font_name = font_name
        self.lang = lang
        self.save_path = save_path
        self.open_ = open_

    def run(self):
        algorithm.make_prescription(self.font_name, self.lang, self.save_path, self.open_)


def saving(font_name, lang, save_path, open_):
    thread = QThread()
    alg = AlgThread(font_name, lang, save_path, open_)
    alg.moveToThread(thread)
    thread.started.connect(alg.run)
    thread.start()


app = QApplication(sys.argv)
window = MainWindow()
window.saving_sgl.connect(saving)
window.show()
sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

В функции saving() вы создаете объект thread :

thread = QThread()

thread - это локальна переменная и удаляется сборщиком мусора.
Чтобы продлить ей жизнь, нужен родитель:

    thread = QThread(window)    

import sys
# ? from design import MainWindow
from PyQt5.QtWidgets import QApplication, QMainWindow                          # + QMainWindow
from PyQt5.QtCore import QObject, QThread, QTimer                              # + QTimer
# ? import algorithm


class AlgThread(QObject):
    def __init__(self, font_name, lang, save_path, open_):
        super(AlgThread, self).__init__()
        self.font_name = font_name
        self.lang = lang
        self.save_path = save_path
        self.open_ = open_

    def run(self):
#        algorithm.make_prescription(self.font_name, self.lang, self.save_path, self.open_)
        QThread.msleep(3000)                               # имитируем какой-то процесс 3 секунды
        print(f"\ndef run(self): {self.font_name}, {self.lang}, {self.save_path}, {self.open_}")


def saving(font_name, lang, save_path, open_, window):                           # +++ window
    thread = QThread(window)                                                     # +++ window
    alg = AlgThread(font_name, lang, save_path, open_)
    alg.moveToThread(thread)
    thread.started.connect(alg.run)
    thread.start()
    QThread.msleep(100)                                                          # +++


app = QApplication(sys.argv)

# window = MainWindow()
window = QMainWindow()                                                            # +

# window.saving_sgl.connect(saving)
window.show()

font_name, lang, save_path, open_ = 1, 2, 3, 4                                    # +
QTimer.singleShot(10, lambda: saving(font_name, lang, save_path, open_, window))  # +++ window

sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка