fix: 修复 timer.Ticker.Loop 函数首次触发时会触发两次的问题

This commit is contained in:
kercylan98 2023-08-15 11:32:45 +08:00
parent fdde6f9bc7
commit 2bd6aa50cb
2 changed files with 10 additions and 9 deletions

View File

@ -1,8 +1,8 @@
package times package timer
import ( import (
"github.com/kercylan98/minotaur/utils/offset" "github.com/kercylan98/minotaur/utils/offset"
"github.com/kercylan98/minotaur/utils/timer" "github.com/kercylan98/minotaur/utils/times"
"time" "time"
) )
@ -19,8 +19,8 @@ var (
// RegSystemNewDayEvent 注册系统新的一天事件 // RegSystemNewDayEvent 注册系统新的一天事件
// - 建议全局注册一个事件后再另行拓展 // - 建议全局注册一个事件后再另行拓展
// - 将特定 name 的定时任务注册到 ticker 中,在系统时间到达每天的 00:00:00 时触发,如果 trigger 为 true则立即触发一次 // - 将特定 name 的定时任务注册到 ticker 中,在系统时间到达每天的 00:00:00 时触发,如果 trigger 为 true则立即触发一次
func RegSystemNewDayEvent(ticker *timer.Ticker, name string, trigger bool, handle SystemNewDayEventHandle) { func RegSystemNewDayEvent(ticker *Ticker, name string, trigger bool, handle SystemNewDayEventHandle) {
ticker.Loop(name, GetNextDayInterval(time.Now()), Day, timer.Forever, OnSystemNewDayEvent, name) ticker.Loop(name, times.GetNextDayInterval(time.Now()), times.Day, Forever, OnSystemNewDayEvent, name)
systemNewDayEventHandles[name] = append(systemNewDayEventHandles[name], handle) systemNewDayEventHandles[name] = append(systemNewDayEventHandles[name], handle)
if trigger { if trigger {
OnSystemNewDayEvent(name) OnSystemNewDayEvent(name)
@ -37,8 +37,8 @@ func OnSystemNewDayEvent(name string) {
// RegOffsetTimeNewDayEvent 注册偏移时间新的一天事件 // RegOffsetTimeNewDayEvent 注册偏移时间新的一天事件
// - 建议全局注册一个事件后再另行拓展 // - 建议全局注册一个事件后再另行拓展
// - 与 RegSystemNewDayEvent 类似,但是触发时间为 offset 时间到达每天的 00:00:00 // - 与 RegSystemNewDayEvent 类似,但是触发时间为 offset 时间到达每天的 00:00:00
func RegOffsetTimeNewDayEvent(ticker *timer.Ticker, name string, offset *offset.Time, trigger bool, handle OffsetTimeNewDayEventHandle) { func RegOffsetTimeNewDayEvent(ticker *Ticker, name string, offset *offset.Time, trigger bool, handle OffsetTimeNewDayEventHandle) {
ticker.Loop(name, GetNextDayInterval(offset.Now()), Day, timer.Forever, OnOffsetTimeNewDayEvent, name) ticker.Loop(name, times.GetNextDayInterval(offset.Now()), times.Day, Forever, OnOffsetTimeNewDayEvent, name)
offsetTimeNewDayEventHandles[name] = append(offsetTimeNewDayEventHandles[name], handle) offsetTimeNewDayEventHandles[name] = append(offsetTimeNewDayEventHandles[name], handle)
if trigger { if trigger {
OnOffsetTimeNewDayEvent(name) OnOffsetTimeNewDayEvent(name)

View File

@ -38,12 +38,14 @@ func (slf *Scheduler) Next(prev time.Time) time.Time {
slf.lock.RLock() slf.lock.RLock()
defer slf.lock.RUnlock() defer slf.lock.RUnlock()
if slf.kill || (slf.total > 0 && slf.trigger >= slf.total) { if slf.kill || (slf.total > 0 && slf.trigger > slf.total) {
return time.Time{} return time.Time{}
} }
if slf.trigger == 0 { if slf.trigger == 0 {
slf.trigger++
return prev.Add(slf.after) return prev.Add(slf.after)
} }
slf.trigger++
return prev.Add(slf.interval) return prev.Add(slf.interval)
} }
@ -56,8 +58,7 @@ func (slf *Scheduler) Caller() {
return return
} }
slf.trigger++ if slf.total > 0 && slf.trigger > slf.total {
if slf.total > 0 && slf.trigger >= slf.total {
slf.lock.Unlock() slf.lock.Unlock()
slf.ticker.StopTimer(slf.name) slf.ticker.StopTimer(slf.name)
} else { } else {