【问题标题】:Pause/Resume functions for timer定时器的暂停/恢复功能
【发布时间】:2014-09-28 20:35:53
【问题描述】:

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

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

from threading import Timer
import time

def timeout():
     print "Game over"

t = Timer(20 * 60, timeout)
t.start()

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

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:
    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()
    

    你的作业:

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

    【讨论】:

    • 试试看,t = ResumableTimer(5, someFunction); t.start(); t.pause(); t.resume(),如果可行,请将我的问题标记为正确。
    【解决方案2】:

    最终课程发布

    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)
    
    

    【讨论】:

      【解决方案3】:

      要考虑的另一种方法是跟踪在每个“停止”计时器但实际上让计时器运行的时间段内经过的时间。然后在任务结束时,从总经过时间中减去总暂停时间。

      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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 2019-03-06
        • 1970-01-01
        相关资源
        最近更新 更多