2016-01-20 23 views
0

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

但是我對比賽條件和其他類似問題保持警惕。這是要走的路,還是有更多的本土我可以使用?

+0

time.After可能會更好。 – Justlike

+0

time.After(...)也許更好。 – Justlike

回答

1

有一個更簡單的方法。你仍然可以使用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()) 
}