def __iter__(self): if self.initialIteration: yield 0, 0 while now() < self.endTimeMS: currentTimeMS = now() # keep it internally consistent, # but yield at end will be ever so slightly off nextStepNumber = (currentTimeMS + self.stepTimeMS - self.startTimeMS) // self.stepTimeMS nextStepTime = (nextStepNumber * self.stepTimeMS) + self.startTimeMS self.count = nextStepNumber if nextStepTime > self.endTimeMS: nextStepTime = self.endTimeMS # The extra +1ms here is to ensure we don't undershoot and loop too many times remainingWaitTime = nextStepTime - currentTimeMS + 1 if remainingWaitTime > 0: sleep( remainingWaitTime / 1000.0 ) newCurrentTimeMS = now() lastStepDuration = (newCurrentTimeMS - self.lastStepTimeMS) / 1000.0 self.lastStepTimeMS = newCurrentTimeMS yield self.count, lastStepDuration
def __iter__(self): if self.initialIteration: self.count += 1 yield 0, 0 while now() < self.endTimeMS: currentTimeMS = now() # keep it internally consistent, # but yield at end will be ever so slightly off if self.lastStepTimeMS + self.stepTimeMS > self.endTimeMS: remainingWaitTime = self.startTimeMS + self.maxTimeMS - currentTimeMS else: # The extra +1ms here is to ensure we don't undershoot and loop too many times remainingWaitTime = self.lastStepTimeMS + self.stepTimeMS - currentTimeMS + 1 if remainingWaitTime > 0: sleep(remainingWaitTime / 1000.0) self.count += 1 newCurrentTimeMS = now() lastStepDuration = (newCurrentTimeMS - self.lastStepTimeMS) / 1000.0 self.lastStepTimeMS = newCurrentTimeMS yield self.count, lastStepDuration
def __init__(self, maxTime=0.0, stepTime=0.0, numSteps=0, initialIteration=True): maxTimeMS = maxTime * 1000.0 stepTimeMS = stepTime * 1000.0 if maxTimeMS and numSteps and not stepTimeMS: stepTimeMS = maxTimeMS / numSteps self.stepTimeMS = stepTimeMS self.maxTimeMS = maxTimeMS self.initialIteration = initialIteration self.startTimeMS = now() self.count = 0 self.endTimeMS = self.startTimeMS + self.maxTimeMS self.lastStepTimeMS = self.startTimeMS
def __exit__(self, exc_type, exc_val, exc_tb): timeRemainingMS = self.endTimeMS - now() if timeRemainingMS > 0: sleep(timeRemainingMS / 1000.0)
def __enter__(self): self.startTimeMS = now() self.endTimeMS = self.startTimeMS + self.delayMS return lambda : self.endTimeMS - now()