为了账号安全,请及时绑定邮箱和手机立即绑定

golang计时器从零重新计算

golang计时器从零重新计算

Go
慕婉清6462132 2022-01-04 10:58:56
我需要写一个计时器,它可能会重置为零。例如,我有一个trm := time.NewTimer(10)然后,如果在它到期之前发生了什么,计时器将清除它拥有的所有数据,并从 0 重新计算,就像我重新创建同一个计时器一样。我检查了 Go 的时间 API,并没有找到任何东西。有小费吗?谢谢。
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

要用time.Reset什么?


重置将计时器更改为在持续时间 d 后到期。如果计时器已激活,则返回 true,如果计时器已过期或已停止,则返回 false。


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


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)

        }        

    }

}


查看完整回答
反对 回复 2022-01-04
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您可以使用timer.Reset函数来重置计时器。要更新它,请传递最初用作参数的相同持续时间。(在你的情况下10)


从包文档:


重置将计时器更改为在持续时间 d 后到期。如果计时器已激活,则返回 true,如果计时器已过期或已停止,则返回 false。


因此,当您将相同的持续时间传递给 时Reset,计时器将从该持续时间 d 开始计数。你有效地renew计时器。


例如:


if eventHappened {

   timer.Reset(10)

}


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 237 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号