Я следую руководству по многопоточности в графическом интерфейсе Python (которое работает как положено) и попытался адаптировать его к своему случаю. Однако иногда поток работает так, как я ожидаю, хотя случайно поток не запускается или происходит сбой. Какую ошибку я допустил при переходе от примера к своему коду?
Ниже приведен минимальный воспроизводимый код, который может вызвать проблему.
import sys
import time
from PySide6.QtCore import QThreadPool, Slot, Signal,QObject,QRunnable
from PySide6.QtWidgets import QApplication,QMainWindow,QWidget,QVBoxLayout,QPushButton,QListWidget
class Device:
def long_function(self):
time.sleep(1)
return ['ciao','test']
class Ui_MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(800, 600)
self.setWindowTitle('Test1')
layout = QVBoxLayout()
self.button_start = QPushButton('Start')
layout.addWidget(self.button_start)
self.log = QListWidget()
layout.addWidget(self.log)
centralwidget = QWidget()
centralwidget.setLayout(layout)
self.setCentralWidget(centralwidget)
class WorkerSignals(QObject):
result = Signal(object)
class Worker(QRunnable):
def __init__(self,fn):
super().__init__()
self.fn = fn
self.signals = WorkerSignals()
@Slot()
def run(self):
res = self.fn()
self.signals.result.emit(res)
class Controller:
def __init__(self,ui,dev):
self.ui = ui
self.dev = dev
self.ui.button_start.clicked.connect(self.start)
self.threadpool = QThreadPool()
self.ui.show()
def start(self):
worker = Worker(lambda : self.dev.long_function())
worker.signals.result.connect(self.update)
self.threadpool.start(worker)
self.ui.log.addItem('Started')
@Slot()
def update(self,l):
self.ui.log.addItem('Ende d')
self.ui.log.addItems(l)
def main():
app = QApplication(sys.argv)
# views
mainwindow = Ui_MainWindow()
# models
dev = Device()
# controller
controller = Controller(mainwindow,dev)
sys.exit(app.exec())
if __name__ == '__main__':
main()
Подробнее здесь: https://stackoverflow.com/questions/797 ... tion-fault