定时器的暂停/恢复功能



我需要使用一个可以暂停和恢复的计时器。据我所知,Python中只有一个计时器,它包含在threading包中,但我不能暂停或恢复它,只能取消它。

这是在Python中使用计时器的标准代码:

from threading import Timer
import time
def timeout():
     print "Game over"
t = Timer(20 * 60, timeout)
t.start()

那么我应该怎么做才能用这个定时器实现暂停/恢复功能呢?

import threading, time
class ResumableTimer:
    def __init__(self, timeout, callback):
        self.timeout = timeout
        self.callback = callback
        self.timer = threading.Timer(timeout, callback)
        self.startTime = time.time()
    def start(self):
        self.timer.start()
    def pause(self):
        self.timer.cancel()
        self.pauseTime = time.time()
    def resume(self):
        self.timer = threading.Timer(
            self.timeout - (self.pauseTime - self.startTime),
            self.callback)
        self.timer.start()

你的家庭作业:

  • 继承
  • 例外情况?支票
  • 比可恢复计时器更好的东西

最终类发布

from threading import Timer
import time

class RenewableTimer:
    def __init__(self, timeout, callback):
        self.timer = Timer(timeout, callback)
        self.start_time = None
        self.cancel_time = None
        # Used for creating a new timer upon renewal
        self.timeout = timeout
        self.callback = callback
    def cancel(self):
        self.timer.cancel()
    def start(self):
        # NOTE: erroneously calling this after pausing causes errors where
        # start_time is updated, and then you get a RuntimeError
        # for trying to restart a thread
        self.start_time = time.time()
        self.timer.start()
    def pause(self):
        self.cancel_time = time.time()
        self.timer.cancel()
        return self.get_remaining_time()
    def resume(self):
        self.timeout = self.get_remaining_time()
        self.timer = Timer(self.timeout, self.callback)
        self.start_time = time.time()
        self.timer.start()
    def get_remaining_time(self):
        if self.start_time is None or self.cancel_time is None:
            return self.timeout
        return self.timeout - (self.cancel_time - self.start_time)

另一种需要考虑的方法是跟踪每个时段的时间;停止";计时器,但实际上保持计时器运行。然后在任务结束时,只需从总运行时间中减去总暂停时间。

import keyboard
from timeit import default_timer as timer
elapsedPauseTime = 0;
print("'s' to start task timer")
print("'p' to pause task timer")
print("'r' to resume task timer")
print("'e' to end task timer")
while (1 == 1):
    if keyboard.read_key() == "s":
        print("Task Timer Started")
        timerStart = timer()
    if keyboard.read_key() == "p":
        print("Task Timer pause counter started")
        timerPauseStart = timer()
    if keyboard.read_key() == "r":
        print("Task Timer pause counter stopped")
        timerPauseEnd = timer()
        elapsedPauseTime = elapsedPauseTime + timerPauseEnd - timerPauseStart
    if keyboard.read_key() == "e":
        print("Task Timer Ended")
        timerEnd = timer()
        break
print("Total time: " + str(timerEnd - timerStart))
print("Pause time: " + str(elapsedPauseTime))
print("Task time with pauses: " + str(timerEnd - timerStart - elapsedPauseTime))