新增定时器重新开启功能

This commit is contained in:
boyce
2020-12-16 16:12:59 +08:00
parent 1eeffb2d05
commit bcd1e9969d
2 changed files with 21 additions and 6 deletions

View File

@@ -8,6 +8,11 @@ import (
) )
func SetupTimer(timer *Timer) *Timer{ func SetupTimer(timer *Timer) *Timer{
if timer.rOpen == true {
return nil
}
timer.rOpen = true
timerHeapLock.Lock() // 使用锁规避竞争条件 timerHeapLock.Lock() // 使用锁规避竞争条件
heap.Push(&timerHeap,timer) heap.Push(&timerHeap,timer)
timerHeapLock.Unlock() timerHeapLock.Unlock()
@@ -94,7 +99,7 @@ func tick() bool{
return true return true
} }
t.rOpen = false
t.C <- t t.C <- t
return true return true
} }

View File

@@ -1,6 +1,7 @@
package timer package timer
import ( import (
"fmt"
"reflect" "reflect"
"runtime" "runtime"
"sync" "sync"
@@ -16,6 +17,7 @@ type Timer struct {
fireTime time.Time // 触发时间 fireTime time.Time // 触发时间
cb func() cb func()
AdditionData interface{} //定时器附加数据 AdditionData interface{} //定时器附加数据
rOpen bool //是否重新打开
} }
// Ticker // Ticker
@@ -52,7 +54,7 @@ func newTimer(d time.Duration,c chan *Timer,cb func(),name string,additionData i
timer.cb = cb timer.cb = cb
timer.name = name timer.name = name
timer.interval = d timer.interval = d
timer.rOpen = false
return timer return timer
} }
@@ -89,9 +91,12 @@ func (t *Timer) Do(){
} }
} }
func (t *Timer) SetupTimer(now time.Time){ func (t *Timer) SetupTimer(now time.Time) error{
t.fireTime = now.Add(t.interval) t.fireTime = now.Add(t.interval)
SetupTimer(t) if SetupTimer(t) == nil {
return fmt.Errorf("Failed to install timer.")
}
return nil
} }
func (t *Timer) GetInterval() time.Duration{ func (t *Timer) GetInterval() time.Duration{
@@ -122,13 +127,18 @@ func (disp *Dispatcher) AfterFunc(d time.Duration, cb func(),onTimerClose OnTime
funName := runtime.FuncForPC(reflect.ValueOf(cb).Pointer()).Name() funName := runtime.FuncForPC(reflect.ValueOf(cb).Pointer()).Name()
timer := newTimer(d,disp.ChanTimer,cb,funName,nil) timer := newTimer(d,disp.ChanTimer,cb,funName,nil)
cbFunc := func() { cbFunc := func() {
onTimerClose(timer)
releaseTimer(timer)
if timer.IsActive() == false { if timer.IsActive() == false {
onTimerClose(timer)
releaseTimer(timer)
return return
} }
cb() cb()
if timer.rOpen ==false {
onTimerClose(timer)
releaseTimer(timer)
}
} }
timer.cb = cbFunc timer.cb = cbFunc