improved Timer class

This commit is contained in:
Daniel Langbein 2025-02-23 21:12:26 +01:00
parent d14a649997
commit 4f0adc181a
Signed by: langfingaz
GPG Key ID: 6C47C753F0823002

View File

@ -1,58 +1,81 @@
import time import time
class Timer: class SimpleTimer:
def __init__(self) -> None: def __init__(self) -> None:
self.start_seconds: float | None= None self.start_seconds: float = 0
self.pause_timer: Timer | None = None self.started = False
def start(self) -> None: def start(self) -> None:
""" """
Start time measurement Start time measurement
""" """
self.start_seconds = self.current_time() if not self.started:
self.start_seconds = self.current_time()
self.started = True
def is_started(self) -> bool: def is_started(self) -> bool:
""" """
:return: Weather time measurement has been started. :return: Weather time measurement has been started.
""" """
return self.start_seconds is not None return self.started
def read(self) -> float:
"""
Return measured time in seconds.
"""
if self.started:
end_seconds = self.current_time()
delta = end_seconds - self.start_seconds
return delta
else:
raise ValueError(f'{self.__class__.__name__} has to be started before there is a time measurement.')
def reset(self) -> None:
self.started = False
@classmethod
def current_time(cls):
return time.time()
class Timer(SimpleTimer):
def __init__(self) -> None:
super().__init__()
self.pause_timer = SimpleTimer()
def pause(self) -> None: def pause(self) -> None:
""" """
Pause time measurement. Pause time measurement.
""" """
self.pause_timer = Timer()
self.pause_timer.start() self.pause_timer.start()
def is_paused(self) -> bool: def is_paused(self) -> bool:
""" """
:return: Weather time measurement is paused. :return: Weather time measurement is paused.
""" """
return self.pause_timer is not None return self.pause_timer.is_started()
def resume(self) -> None: def resume(self) -> None:
""" """
Resumes time measurement. Resumes time measurement.
""" """
if self.pause_timer: if self.is_paused():
pause_delta = self.pause_timer.read() pause_delta = self.pause_timer.read()
self.start_seconds += pause_delta self.start_seconds += pause_delta
self.pause_timer = None self.pause_timer.reset()
def read(self) -> float: def read(self) -> float:
""" """
Return measured time in seconds. Return measured time in seconds.
""" """
end_seconds = self.current_time() delta = SimpleTimer.read(self)
delta = end_seconds - self.start_seconds
if self.is_paused(): if self.is_paused():
delta -= self.pause_timer.read() delta -= self.pause_timer.read()
return delta return delta
@classmethod def reset(self) -> None:
def current_time(cls): SimpleTimer.reset(self)
return time.time() self.pause_timer.reset()