Files
EdgeNode/internal/utils/ticker.go

44 lines
644 B
Go
Raw Normal View History

2020-09-26 08:07:07 +08:00
package utils
import (
2021-12-08 22:19:15 +08:00
"sync"
2020-09-26 08:07:07 +08:00
"time"
)
2021-12-08 22:19:15 +08:00
// Ticker 类似于time.Ticker但能够真正地停止
2020-09-26 08:07:07 +08:00
type Ticker struct {
2021-12-08 22:19:15 +08:00
raw *time.Ticker
done chan bool
once sync.Once
2020-09-26 08:07:07 +08:00
C <-chan time.Time
}
2021-12-08 22:19:15 +08:00
// NewTicker 创建新Ticker
2020-09-26 08:07:07 +08:00
func NewTicker(duration time.Duration) *Ticker {
raw := time.NewTicker(duration)
return &Ticker{
2021-12-08 22:19:15 +08:00
raw: raw,
C: raw.C,
done: make(chan bool, 1),
2020-09-26 08:07:07 +08:00
}
}
2021-12-08 22:19:15 +08:00
// Next 查找下一个Tick
2020-09-26 08:07:07 +08:00
func (this *Ticker) Next() bool {
select {
case <-this.raw.C:
return true
2021-12-08 22:19:15 +08:00
case <-this.done:
2020-09-26 08:07:07 +08:00
return false
}
}
2021-12-08 22:19:15 +08:00
// Stop 停止
2020-09-26 08:07:07 +08:00
func (this *Ticker) Stop() {
2021-12-08 22:19:15 +08:00
this.once.Do(func() {
this.raw.Stop()
this.done <- true
})
2020-09-26 08:07:07 +08:00
}