Python计时器不断增加但不暂停

0 投票
1 回答
38 浏览
提问于 2025-04-13 01:05

我现在正在尝试制作一个计时器,用来跟踪一个Python程序的运行时间。我试过很多不同的方法,但在使用while True循环和通过函数调用时,没有一个能正常工作:计时器在需要暂停的时候并没有暂停。

经过几个小时的尝试,我放弃了,后来找到一个GitHub用户,他发布了一个可以暂停的计时器代码。

这是我用来计时的修改过的代码:

from time import time

class Timer:
    def __init__(self):
        self.time_data = []
        self.is_started = False
        self.start_time = None

    def start(self):
        if self.is_started:
            return
        else:
            self.start_time = time()
            self.is_started = True
        
        return self

    def pause(self) -> None:
        elapsed = time() - self.start_time
        self.is_started = False

        self.time_data.append(elapsed)
        
    def resume(self):
        if self.is_started:
            print("Timer is already running")
            return

        self.start_time = (time() - sum(self.time_data)) + 1
        self.is_started = True    
        
    def elapsed(self):
        if self.is_started:
            current_elapsed = time() - self.start_time
            total_elapsed = sum(self.time_data) + current_elapsed
        else:
            total_elapsed = sum(self.time_data)
        return total_elapsed

然后我尝试在一个简单的程序上测试它:

from timing import Timer

timer = Timer()
timer.start()

sleep(1)

timer.pause()

sleep(2)

print(timer.elapsed()) #should print 1"
timer.resume()

sleep(3)

print(timer.elapsed()) #4"

timer.restart()
timer.pause()
print(timer.elapsed()) #0"

这个程序运行得很好,但当我尝试使用While True和函数时:

from time import sleep
from timing import Timer

timer = Timer()

def start():
    timer.start()

def pause():
    timer.pause()

start()
while True:
    print(timer.elapsed())

    if timer.elapsed() >= 3:
        pause() 
        print("paused!")
    
    sleep(0.25) 

结果是这样的:

2.2578864097595215
2.5090396404266357
2.7601206302642822
3.011416435241699
paused!
3.011416435241699
paused!
6.274340391159058
paused!

然后它就一直这样,快速地不断增加,最终达到一个很高的值...

有没有人知道这是什么问题呢?

谢谢。

1 个回答

1

看起来那个实现有点问题。这里有一些看起来能正常工作的代码:

import time


class Timer:
    def __init__(self):
        self.start_time = None
        self.pause_time = None
        self.elapsed_time = 0

    def start(self):
        self.start_time = time.time()
        self.pause_time = None

    def pause(self):
        if self.pause_time is not None:
            raise ValueError("Timer is already paused")
        if self.start_time is None:
            raise ValueError("Timer is not running")
        self.pause_time = time.time()
        self.elapsed_time += self.pause_time - self.start_time
        self.start_time = None

    def resume(self):
        if self.pause_time is None:
            raise ValueError("Timer is not paused")
        self.start()

    def restart(self):
        self.start_time = time.time()
        self.elapsed_time = 0

    def elapsed(self):
        if self.start_time is not None:
            return time.time() - self.start_time + self.elapsed_time
        return self.elapsed_time


timer = Timer()
timer.start()
time.sleep(1)
timer.pause()
time.sleep(2)
print(timer.elapsed())  # should print 1"
timer.resume()
time.sleep(3)
print(timer.elapsed())  # 4"
timer.restart()
timer.pause()
print(timer.elapsed())  # 0"

撰写回答