Source code for director.timercallback

import time
from PythonQt import QtCore
import traceback

[docs]class TimerCallback(object): def __init__(self, targetFps=30, callback=None): ''' Construct TimerCallback. The targetFps defines frames per second, the frequency for the ticks() callback method. ''' self.targetFps = targetFps self.timer = QtCore.QTimer() self.useScheduledTimer = True self.timer.setSingleShot(True) self.singleShotTimer = QtCore.QTimer() self.singleShotTimer.setSingleShot(True) self.callback = callback
[docs] def start(self): ''' Start the timer. ''' if not self.timer.isActive(): self.timer.connect('timeout()', self._timerEvent) self.startTime = time.time() self.lastTickTime = self.startTime if self.useScheduledTimer: self.timer.start(0) else: self.timer.start(int(1000.0 / self.targetFps))
[docs] def stop(self): ''' Stop the timer. ''' self.timer.stop() self.timer.disconnect('timeout()', self._timerEvent)
[docs] def tick(self): ''' Timer event callback method. Subclasses can override this method. ''' if self.callback: return self.callback()
[docs] def isActive(self): ''' Return whether or not the timer is active. ''' return self.timer.isActive()
[docs] def disableScheduledTimer(self): self.useScheduledTimer = False self.timer.setSingleShot(False)
[docs] def singleShot(self, timeoutInSeconds): if not self.singleShotTimer.isActive(): self.singleShotTimer.connect('timeout()', self._singleShotTimerEvent) self.singleShotTimer.start(int(timeoutInSeconds * 1000))
def _singleShotTimerEvent(self): self.tick() self.singleShotTimer.disconnect('timeout()', self._singleShotTimerEvent) def _schedule(self, elapsedTimeInSeconds): ''' This method is given an elapsed time since the start of the last call to ticks(). It schedules a timer event to acheive the targetFps. ''' fpsDelayMilliseconds = int(1000.0 / self.targetFps) elapsedMilliseconds = int(elapsedTimeInSeconds*1000.0) waitMilliseconds = fpsDelayMilliseconds - elapsedMilliseconds self.timer.start(waitMilliseconds if waitMilliseconds > 0 else 1) def _timerEvent(self): ''' Internal timer callback method. Calls tick() and measures elapsed time. ''' startTime = time.time() self.elapsed = startTime - self.lastTickTime try: result = self.tick() except: self.stop() raise if result is not False: self.lastTickTime = startTime if self.useScheduledTimer: self._schedule(time.time() - startTime) else: self.stop()