golang定时器从零开始重新计算

标签 go timer

我需要编写一个计时器,它可以将自身重置为零。例如,我有一个

trm := time.NewTimer(10)

然后,如果在过期之前发生了某些事情,计时器将清除其所有数据,并从 0 重新计算,就像我重新新建一个计时器一样。

我检查了Go的时间API,没有发现任何东西。有什么建议吗?

谢谢。

最佳答案

使用time.Reset怎么样? ?

Reset changes the timer to expire after duration d. It returns true if the timer had been active, false if the timer had expired or been stopped.

另一个解决方案是初始化另一个计时器。

t.Reset(x)
t := time.NewTimer(x)

除了避免垃圾回收之外,其他都是相同的。

一个典型的例子如下。如果耗时小于超时时间,它将重置计时器。

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    const timeout = 1 * time.Millisecond
    t := time.NewTimer(timeout)
    for {
        t2 := timeout + time.Duration(rand.Intn(100)-50)*timeout/100
        start := time.Now()
        select {
        case <-time.After(t2):
            fmt.Println("Time after:", t2)
        }
        elapsed := time.Since(start)
        if elapsed < timeout {
            fmt.Println("Time ellapsed:", elapsed)
            t.Reset(timeout)
        }        
    }
}

关于golang定时器从零开始重新计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36567456/

相关文章:

javascript - 设置计时器并使用 javascript/PHP 检查

c# - C++/CLI System.Timers.Timer 在将 Interval 设置为 100ms 时已过去 20 秒

go - 使用一个返回值?

ios - getTimeElapsed 在 Swift 中使用 NSTimer

types - golang 类型转换不按预期工作

Go包依赖布局

python - 如何在 Python 中使用计时器解锁条件?

ios - Swift 3 精确定时器重复(iOS 9)

concurrency - 什么会导致代码阻塞?

loops - For 循环逻辑通过查看 future 的点值来标记一系列数据点的趋势类型