# --- START OF FILE src/utils/worker.py --- import sys import traceback from PyQt6.QtCore import QObject, QRunnable, pyqtSignal, pyqtSlot class WorkerSignals(QObject): """ Definisce i segnali disponibili da un thread worker. - finished: emesso quando il task รจ completato, senza errori. - error: emesso se si verifica un'eccezione. - result: emesso con il risultato del task. """ finished = pyqtSignal() error = pyqtSignal(tuple) result = pyqtSignal(object) class Worker(QRunnable): """ Worker thread generico che esegue una funzione in background. Eredita da QRunnable per essere usato con QThreadPool. """ def __init__(self, fn, *args, **kwargs): super(Worker, self).__init__() self.fn = fn self.args = args self.kwargs = kwargs self.signals = WorkerSignals() @pyqtSlot() def run(self): """ Esegue il task. Emette i segnali appropriati. """ try: result = self.fn(*self.args, **self.kwargs) except: traceback.print_exc() exctype, value = sys.exc_info()[:2] self.signals.error.emit((exctype, value, traceback.format_exc())) else: self.signals.result.emit(result) finally: self.signals.finished.emit()