Pause/Resume functions for timer
I need to use a timer which can be paused and resumed. As far as I know there is only one timer in Python which is contained in the threading
package, but I cannot pause or resume it, only cancel it.
This is a standard code to use the timer in Python:
from threading import Timer
import time
def timeout():
print "Game over"
t = Timer(20 * 60, timeout)
t.start()
So what should I do to realize pause/resume functions with this timer?
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()
Your homework:
- Inheritance?
- Exceptions? Checks?
- Something better than a resumable timer
final class release
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)