3 from __future__ import with_statement
4 from __future__ import division
9 sys.path.insert(0,"./src")
10 from util import qt_compat
11 QtCore = qt_compat.QtCore
14 class QThread44(QtCore.QThread):
16 This is to imitate QThread in Qt 4.4+ for when running on older version
17 See http://labs.trolltech.com/blogs/2010/06/17/youre-doing-it-wrong
18 (On Lucid I have Qt 4.7 and this is still an issue)
21 def __init__(self, parent = None):
22 QtCore.QThread.__init__(self, parent)
28 class _WorkerThread(QtCore.QObject):
30 _taskComplete = qt_compat.Signal(object)
32 def __init__(self, futureThread):
33 QtCore.QObject.__init__(self)
34 self._futureThread = futureThread
35 self._futureThread._addTask.connect(self._on_task_added)
36 self._taskComplete.connect(self._futureThread._on_task_complete)
38 @qt_compat.Slot(object)
39 def _on_task_added(self, task):
40 if not self._futureThread._isRunning:
43 func, args, kwds, on_success, on_error = task
46 result = func(*args, **kwds)
49 print "Error, passing it back to the main thread"
53 taskResult = on_success, on_error, isError, result
54 self._taskComplete.emit(taskResult)
57 class FutureThread(QtCore.QObject):
59 _addTask = qt_compat.Signal(object)
62 QtCore.QObject.__init__(self)
63 self._thread = QThread44()
64 self._isRunning = False
65 self._worker = _WorkerThread(self)
66 self._worker.moveToThread(self._thread)
70 self._isRunning = True
73 self._isRunning = False
76 def add_task(self, func, args, kwds, on_success, on_error):
77 assert self._isRunning, "Task queue not started"
78 task = func, args, kwds, on_success, on_error
79 self._addTask.emit(task)
81 @qt_compat.Slot(object)
82 def _on_task_complete(self, taskResult):
83 on_success, on_error, isError, result = taskResult
84 if not self._isRunning:
86 print "Masking: %s" % (result, )
88 result = StopIteration("Cancelling all callbacks")
89 callback = on_success if not isError else on_error
93 print "Callback errored"
96 class Producer(QtCore.QObject):
98 data = qt_compat.Signal(int)
99 done = qt_compat.Signal()
102 QtCore.QObject.__init__(self)
106 print "Starting producer"
113 class Consumer(QtCore.QObject):
116 QtCore.QObject.__init__(self)
120 print "Starting consumer"
123 def print_done(self):
127 def print_data(self, i):
131 def run_producer_consumer():
132 app = QtCore.QCoreApplication([])
134 producerThread = QThread44()
135 producer = Producer()
136 producer.moveToThread(producerThread)
137 producerThread.started.connect(producer.process)
139 consumerThread = QThread44()
140 consumer = Consumer()
141 consumer.moveToThread(consumerThread)
142 consumerThread.started.connect(consumer.process)
144 producer.data.connect(consumer.print_data)
145 producer.done.connect(consumer.print_done)
149 print "Shutting down"
150 producerThread.quit()
151 consumerThread.quit()
153 producer.done.connect(producer_done)
165 producerThread.finished.connect(thread_done)
166 consumerThread.finished.connect(thread_done)
168 producerThread.start()
169 consumerThread.start()
170 print "Status %s" % app.exec_()
174 app = QtCore.QCoreApplication([])
176 bright = FutureThread()
177 def on_failure(*args):
178 print "Failure", args
180 def on_success(*args):
181 print "Success", args
186 timer = QtCore.QTimer()
192 bright.add_task(task, (timeouts[0], ), {}, on_success, on_failure)
197 timer.timeout.connect(on_timeout)
201 print "Status %s" % app.exec_()
204 if __name__ == "__main__":
205 run_producer_consumer()