From bcd1e9969d9c76807c9bd7c5653fa09057326c3c Mon Sep 17 00:00:00 2001 From: boyce Date: Wed, 16 Dec 2020 16:12:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=9A=E6=97=B6=E5=99=A8?= =?UTF-8?q?=E9=87=8D=E6=96=B0=E5=BC=80=E5=90=AF=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/timer/heap.go | 7 ++++++- util/timer/timer.go | 20 +++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/util/timer/heap.go b/util/timer/heap.go index d796f1d..1b0b672 100644 --- a/util/timer/heap.go +++ b/util/timer/heap.go @@ -8,6 +8,11 @@ import ( ) func SetupTimer(timer *Timer) *Timer{ + if timer.rOpen == true { + return nil + } + + timer.rOpen = true timerHeapLock.Lock() // 使用锁规避竞争条件 heap.Push(&timerHeap,timer) timerHeapLock.Unlock() @@ -94,7 +99,7 @@ func tick() bool{ return true } - + t.rOpen = false t.C <- t return true } diff --git a/util/timer/timer.go b/util/timer/timer.go index fc25d1f..4471a2b 100644 --- a/util/timer/timer.go +++ b/util/timer/timer.go @@ -1,6 +1,7 @@ package timer import ( + "fmt" "reflect" "runtime" "sync" @@ -16,6 +17,7 @@ type Timer struct { fireTime time.Time // 触发时间 cb func() AdditionData interface{} //定时器附加数据 + rOpen bool //是否重新打开 } // Ticker @@ -52,7 +54,7 @@ func newTimer(d time.Duration,c chan *Timer,cb func(),name string,additionData i timer.cb = cb timer.name = name timer.interval = d - + timer.rOpen = false 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) - SetupTimer(t) + if SetupTimer(t) == nil { + return fmt.Errorf("Failed to install timer.") + } + return nil } 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() timer := newTimer(d,disp.ChanTimer,cb,funName,nil) cbFunc := func() { - onTimerClose(timer) - releaseTimer(timer) if timer.IsActive() == false { + onTimerClose(timer) + releaseTimer(timer) return } cb() + + if timer.rOpen ==false { + onTimerClose(timer) + releaseTimer(timer) + } } timer.cb = cbFunc