Прекращение работы 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_())
