# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging
logging.debug('Loading threads.py')
# Import PyQt5 classes
from .qt import *
import sys
import traceback
[docs]class WorkerSignals(QObject):
'''
Defines the signals available from a running worker thread.
Supported signals are:
finished
No data
error
`tuple` (exctype, value, traceback.format_exc() )
result
`dict` data returned from processing
status
`str` one of standard status flag message types
'''
finished = pyqtSignal()
error = pyqtSignal(tuple)
result = pyqtSignal(dict)
status = pyqtSignal(str)
[docs]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, callback, *args, **kwargs):
super(Worker, self).__init__()
# Store constructor arguments (re-used for processing)
self.callback = callback
self.args = args
self.kwargs = kwargs
self.signals = WorkerSignals()
@pyqtSlot()
def run(self):
'''
Initialise the runner function with passed args, kwargs.
'''
# Retrieve args/kwargs here; and fire processing using them
try:
result = self.callback(*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) # Return the result of the processing
finally:
self.signals.finished.emit() # Done
# Stub to be over-wridden on subclass
[docs] def process(self, *args, **kwargs):
return False