diff --git a/options.go b/options.go index cb36bbd..2f5d1f8 100644 --- a/options.go +++ b/options.go @@ -47,8 +47,6 @@ if d < 10*time.Millisecond { return } - s.ticker.Stop() - s.ticker = time.NewTicker(d) s.rr = d } } diff --git a/progress.go b/progress.go index b158f26..d2733d5 100644 --- a/progress.go +++ b/progress.go @@ -39,7 +39,6 @@ format string rr time.Duration cw *cwriter.Writer - ticker *time.Ticker pMatrix map[int][]chan int aMatrix map[int][]chan int @@ -62,7 +61,6 @@ format: pformat, cw: cwriter.New(os.Stdout), rr: prr, - ticker: time.NewTicker(prr), waitBars: make(map[*Bar]*Bar), debugOut: ioutil.Discard, } diff --git a/progress_posix.go b/progress_posix.go index 264ef04..426f64d 100644 --- a/progress_posix.go +++ b/progress_posix.go @@ -10,20 +10,23 @@ ) func (p *Progress) serve(s *pState) { + + var resumeTimer *time.Timer + var resumeEvent <-chan time.Time + winchIdleDur := s.rr * 2 winch := make(chan os.Signal, 2) signal.Notify(winch, syscall.SIGWINCH) - var timer *time.Timer - var tickerResumer <-chan time.Time - resumeDelay := s.rr * 2 + ticker := time.NewTicker(s.rr) + refreshCh := ticker.C for { select { case op := <-p.operateState: op(s) - case <-s.ticker.C: + case <-refreshCh: if s.zeroWait { - s.ticker.Stop() + ticker.Stop() signal.Stop(winch) if s.shutdownNotifier != nil { close(s.shutdownNotifier) @@ -42,16 +45,17 @@ tw = s.width } s.render(tw - tw/8) - if timer != nil && timer.Reset(resumeDelay) { + if resumeTimer != nil && resumeTimer.Reset(winchIdleDur) { break } - s.ticker.Stop() - timer = time.NewTimer(resumeDelay) - tickerResumer = timer.C - case <-tickerResumer: - s.ticker = time.NewTicker(s.rr) - tickerResumer = nil - timer = nil + ticker.Stop() + resumeTimer = time.NewTimer(winchIdleDur) + resumeEvent = resumeTimer.C + case <-resumeEvent: + ticker = time.NewTicker(s.rr) + refreshCh = ticker.C + resumeEvent = nil + resumeTimer = nil } } } diff --git a/progress_windows.go b/progress_windows.go index 3599a7d..acd2dbb 100644 --- a/progress_windows.go +++ b/progress_windows.go @@ -2,14 +2,20 @@ package mpb +import "time" + func (p *Progress) serve(s *pState) { + + ticker := time.NewTicker(s.rr) + refreshCh := ticker.C + for { select { case op := <-p.operateState: op(s) - case <-s.ticker.C: + case <-refreshCh: if s.zeroWait { - s.ticker.Stop() + ticker.Stop() if s.shutdownNotifier != nil { close(s.shutdownNotifier) }