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

时间:2016-01-20 02:37:54

标签: go timer

我需要在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()

但我对种族状况和其他类似问题保持警惕。这是要走的路,还是我可以使用更原生的东西?

1 个答案:

答案 0 :(得分:2)

有一种更简单的方法。您仍然可以使用time.Timer来完成您想要的工作,只需跟踪end time.Time

type SecondsTimer struct {
    timer *time.Timer
    end   time.Time
}

func NewSecondsTimer(t time.Duration) *SecondsTimer {
    return &SecondsTimer{time.NewTimer(t), time.Now().Add(t)}
}

func (s *SecondsTimer) Reset(t time.Duration) {
    s.timer.Reset(t)
    s.end = time.Now().Add(t)
}

func (s *SecondsTimer) Stop() {
    s.timer.Stop()
}

所以剩下的时间很简单:

func (s *SecondsTimer) TimeRemaining() time.Duration {
    return s.end.Sub(time.Now())
}