BitMover/_thread_my_stuff.py

86 lines
2.8 KiB
Python

#!/usr/bin/env python
import sys, traceback
from PyQt6.QtCore import pyqtSignal, pyqtSlot, QRunnable, QObject
class WorkerSignals(QObject):
"""
Defines the signals avail from a running worker thread.
Supported signals are:
finished
No Data
error
tuple (exctype, value, traceback.format_exc() )
result
object data returned from processing, anything
progress
int indicating % progress
"""
started = pyqtSignal()
finished = pyqtSignal()
error = pyqtSignal(tuple)
result = pyqtSignal(object)
progress = pyqtSignal(int)
current_file_progress = pyqtSignal(float)
imported_file_count = pyqtSignal(int)
found_file = pyqtSignal(str)
total_file_count = pyqtSignal(int)
checksum_progress = pyqtSignal(int)
checksum_file = pyqtSignal(str)
checksum_dialog_open = pyqtSignal(bool)
class Worker(QRunnable):
"""
Worker Thread
Inherits from QRunnable to handler worker thread setup, signals and wrap-up.
:param callback: The function callback to run on this worker thread. Supplied args and
kwargs will be passed through to the runner.
:type callback: function
:param args: Arguments to pass to the callback function
:param kwargs: Keywords to pass to the callback function
"""
def __init__(self,fn,*args,**kwargs):
super(Worker,self).__init__()
# Store constructor args (re-used for processing)
self.fn = fn
self.args = args
self.kwargs = kwargs
self.signals = WorkerSignals()
# Add the callback to our kwargs
self.kwargs['progress_callback'] = self.signals.progress
self.kwargs['current_file_progress_callback'] = self.signals.current_file_progress
self.kwargs['imported_file_count_callback'] = self.signals.imported_file_count
self.kwargs['found_file_callback'] = self.signals.found_file
self.kwargs['total_file_count_callback'] = self.signals.total_file_count
self.kwargs['checksum_file_callback'] = self.signals.checksum_file
self.kwargs['checksum_progress_callback'] = self.signals.checksum_progress
self.kwargs['checksum_dialog_open_callback'] = self.signals.checksum_dialog_open
@pyqtSlot()
def run(self):
"""
Initialise the runner function with passed args, kwargs.
"""
# Retrieve args/kwargs here; and fire processing using them
try:
self.signals.started.emit()
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()