4 QtCore = qt_compat.QtCore
9 _moduleLogger = logging.getLogger(__name__)
12 class QThread44(QtCore.QThread):
14 This is to imitate QThread in Qt 4.4+ for when running on older version
15 See http://labs.trolltech.com/blogs/2010/06/17/youre-doing-it-wrong
16 (On Lucid I have Qt 4.7 and this is still an issue)
19 def __init__(self, parent = None):
20 QtCore.QThread.__init__(self, parent)
26 class _WorkerThread(QtCore.QObject):
28 _taskComplete = qt_compat.Signal(object)
30 def __init__(self, futureThread):
31 QtCore.QObject.__init__(self)
32 self._futureThread = futureThread
33 self._futureThread._addTask.connect(self._on_task_added)
34 self._taskComplete.connect(self._futureThread._on_task_complete)
36 @qt_compat.Slot(object)
37 def _on_task_added(self, task):
38 self.__on_task_added(task)
40 @misc.log_exception(_moduleLogger)
41 def __on_task_added(self, task):
42 if not self._futureThread._isRunning:
43 _moduleLogger.error("Dropping task")
45 func, args, kwds, on_success, on_error = task
48 result = func(*args, **kwds)
51 _moduleLogger.error("Error, passing it back to the main thread")
55 taskResult = on_success, on_error, isError, result
56 self._taskComplete.emit(taskResult)
59 class FutureThread(QtCore.QObject):
61 _addTask = qt_compat.Signal(object)
64 QtCore.QObject.__init__(self)
65 self._thread = QThread44()
66 self._isRunning = False
67 self._worker = _WorkerThread(self)
68 self._worker.moveToThread(self._thread)
72 self._isRunning = True
75 self._isRunning = False
78 def add_task(self, func, args, kwds, on_success, on_error):
79 assert self._isRunning, "Task queue not started"
80 task = func, args, kwds, on_success, on_error
81 self._addTask.emit(task)
83 @qt_compat.Slot(object)
84 def _on_task_complete(self, taskResult):
85 self.__on_task_complete(taskResult)
87 @misc.log_exception(_moduleLogger)
88 def __on_task_complete(self, taskResult):
89 on_success, on_error, isError, result = taskResult
90 if not self._isRunning:
92 _moduleLogger.error("Masking: %s" % (result, ))
94 result = StopIteration("Cancelling all callbacks")
95 callback = on_success if not isError else on_error
99 _moduleLogger.exception("Callback errored")