from __future__ import with_statement
from __future__ import division
+import functools
import time
-import sys
-sys.path.insert(0,"./src")
-from util import qt_compat
-from util import qore_utils
+FORCE_PYQT = False
+DECORATE = True
-class QThread44(qt_compat.QtCore.QThread):
+
+try:
+ if FORCE_PYQT:
+ raise ImportError()
+ import PySide.QtCore as _QtCore
+ QtCore = _QtCore
+ USES_PYSIDE = True
+except ImportError:
+ import sip
+ sip.setapi('QString', 2)
+ sip.setapi('QVariant', 2)
+ import PyQt4.QtCore as _QtCore
+ QtCore = _QtCore
+ USES_PYSIDE = False
+
+
+if USES_PYSIDE:
+ Signal = QtCore.Signal
+ Slot = QtCore.Slot
+ Property = QtCore.Property
+else:
+ Signal = QtCore.pyqtSignal
+ Slot = QtCore.pyqtSlot
+ Property = QtCore.pyqtProperty
+
+
+def log_exception():
+
+ def log_exception_decorator(func):
+
+ @functools.wraps(func)
+ def wrapper(*args, **kwds):
+ try:
+ return func(*args, **kwds)
+ except Exception:
+ print "Exception", func.__name__
+ raise
+
+ if DECORATE:
+ return wrapper
+ else:
+ return func
+
+ return log_exception_decorator
+
+
+class QThread44(QtCore.QThread):
"""
This is to imitate QThread in Qt 4.4+ for when running on older version
See http://labs.trolltech.com/blogs/2010/06/17/youre-doing-it-wrong
"""
def __init__(self, parent = None):
- qt_compat.QtCore.QThread.__init__(self, parent)
+ QtCore.QThread.__init__(self, parent)
def run(self):
self.exec_()
-class Producer(qt_compat.QtCore.QObject):
+class Producer(QtCore.QObject):
- data = qt_compat.Signal(int)
- done = qt_compat.Signal()
+ data = Signal(int)
+ done = Signal()
def __init__(self):
- qt_compat.QtCore.QObject.__init__(self)
+ QtCore.QObject.__init__(self)
- @qt_compat.Slot()
+ @Slot()
+ @log_exception()
def process(self):
print "Starting producer"
for i in xrange(10):
self.done.emit()
-class Consumer(qt_compat.QtCore.QObject):
+class Consumer(QtCore.QObject):
def __init__(self):
- qt_compat.QtCore.QObject.__init__(self)
+ QtCore.QObject.__init__(self)
- @qt_compat.Slot()
+ @Slot()
+ @log_exception()
def process(self):
print "Starting consumer"
- @qt_compat.Slot()
+ @Slot()
+ @log_exception()
def print_done(self):
print "Done"
- @qt_compat.Slot(int)
+ @Slot(int)
+ @log_exception()
def print_data(self, i):
print i
-if __name__ == "__main__":
- app = qt_compat.QtCore.QCoreApplication([])
+def run_producer_consumer():
+ app = QtCore.QCoreApplication([])
- producerThread = qore_utils.QThread44()
+ producerThread = QThread44()
producer = Producer()
producer.moveToThread(producerThread)
producerThread.started.connect(producer.process)
- consumerThread = qore_utils.QThread44()
+ consumerThread = QThread44()
consumer = Consumer()
consumer.moveToThread(consumerThread)
consumerThread.started.connect(consumer.process)
producer.data.connect(consumer.print_data)
producer.done.connect(consumer.print_done)
- @qt_compat.Slot()
+ @Slot()
+ @log_exception()
def producer_done():
print "Shutting down"
producerThread.quit()
count = [0]
- @qt_compat.Slot()
+ @Slot()
+ @log_exception()
def thread_done():
print "Thread done"
count[0] += 1
producerThread.start()
consumerThread.start()
- print "Status", app.exec_()
+ print "Status %s" % app.exec_()
+
+
+if __name__ == "__main__":
+ run_producer_consumer()