diff --git a/SignalProxy.py b/SignalProxy.py index 95d94ba8..e3719fcf 100644 --- a/SignalProxy.py +++ b/SignalProxy.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from Qt import QtCore from ptime import time +import ThreadsafeTimer __all__ = ['SignalProxy'] @@ -27,7 +28,7 @@ class SignalProxy(QtCore.QObject): self.signal = signal self.delay = delay self.args = None - self.timer = QtCore.QTimer() + self.timer = ThreadsafeTimer.ThreadsafeTimer() self.timer.timeout.connect(self.flush) self.block = False self.slot = slot diff --git a/ThreadsafeTimer.py b/ThreadsafeTimer.py new file mode 100644 index 00000000..d8c4bcee --- /dev/null +++ b/ThreadsafeTimer.py @@ -0,0 +1,41 @@ +from pyqtgraph.Qt import QtCore, QtGui + +class ThreadsafeTimer(QtCore.QObject): + """ + Thread-safe replacement for QTimer. + """ + + timeout = QtCore.Signal() + sigTimerStopRequested = QtCore.Signal() + sigTimerStartRequested = QtCore.Signal(object) + + def __init__(self): + QtCore.QObject.__init__(self) + self.timer = QtCore.QTimer() + self.timer.timeout.connect(self.timerFinished) + self.timer.moveToThread(QtCore.QCoreApplication.instance().thread()) + self.moveToThread(QtCore.QCoreApplication.instance().thread()) + self.sigTimerStopRequested.connect(self.stop, QtCore.Qt.QueuedConnection) + self.sigTimerStartRequested.connect(self.start, QtCore.Qt.QueuedConnection) + + + def start(self, timeout): + isGuiThread = QtCore.QThread.currentThread() == QtCore.QCoreApplication.instance().thread() + if isGuiThread: + #print "start timer", self, "from gui thread" + self.timer.start(timeout) + else: + #print "start timer", self, "from remote thread" + self.sigTimerStartRequested.emit(timeout) + + def stop(self): + isGuiThread = QtCore.QThread.currentThread() == QtCore.QCoreApplication.instance().thread() + if isGuiThread: + #print "stop timer", self, "from gui thread" + self.timer.stop() + else: + #print "stop timer", self, "from remote thread" + self.sigTimerStopRequested.emit() + + def timerFinished(self): + self.timeout.emit() \ No newline at end of file