如何找到定时器触发的剩余时间?

我需要在x几秒钟后运行一个函数,并具有一定的控制能力(重置计时器,停止计时器,找到剩余的执行时间)。time.Timer非常合适 - 唯一缺少的是它似乎无法找到还剩多少时间。


我有哪些选择?


目前,我正在考虑类似的事情:


package main


import "time"


type SecondsTimer struct {

    T       time.Duration

    C       chan time.Time

    control chan time.Duration

    running bool

}


func (s *SecondsTimer) run() {

    for s.T.Seconds() > 0 {

        time.Sleep(time.Second)

        select {

        case f := <-s.control:

            if f > 0 {

                s.T = f

            } else {

                s.running = false

                break

            }

        default:

            s.T = s.T - 1

        }

    }

    s.C <- time.Now()

}

func (s *SecondsTimer) Reset(t time.Duration) {

    if s.running {

        s.control <- t

    } else {

        s.T = t

        go s.run()

    }


}

func (s *SecondsTimer) Stop() {

    if s.running {

        s.control <- 0

    }

}

func NewSecondsTimer(t time.Duration) *SecondsTimer {

    time := SecondsTimer{t, make(chan time.Time), make(chan time.Duration), false}

    go time.run()

    return &time

}

现在我可以s.T.Seconds()根据需要使用了。


但我对竞争条件和其他此类问题持谨慎态度。这是要走的路,还是我可以使用更原生的东西?


不负相思意
浏览 307回答 1
1回答

慕村9548890

有一个更简单的方法。你仍然可以使用 atime.Timer来完成你想要的,你只需要跟踪end time.Time:type SecondsTimer struct {&nbsp; &nbsp; timer *time.Timer&nbsp; &nbsp; end&nbsp; &nbsp;time.Time}func NewSecondsTimer(t time.Duration) *SecondsTimer {&nbsp; &nbsp; return &SecondsTimer{time.NewTimer(t), time.Now().Add(t)}}func (s *SecondsTimer) Reset(t time.Duration) {&nbsp; &nbsp; s.timer.Reset(t)&nbsp; &nbsp; s.end = time.Now().Add(t)}func (s *SecondsTimer) Stop() {&nbsp; &nbsp; s.timer.Stop()}所以剩下的时间很容易:func (s *SecondsTimer) TimeRemaining() time.Duration {&nbsp; &nbsp; return s.end.Sub(time.Now())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go