diff --git a/bar.go b/bar.go index e3366ba..d709352 100644 --- a/bar.go +++ b/bar.go @@ -174,7 +174,7 @@ if s.triggerComplete && !s.completed { s.current = s.total s.completed = true - go b.refreshTillShutdown() + go b.forceRefreshIfLastUncompleted() } }: case <-b.done: @@ -192,7 +192,7 @@ if s.triggerComplete && s.current >= s.total { s.current = s.total s.completed = true - go b.refreshTillShutdown() + go b.forceRefreshIfLastUncompleted() } }: case <-b.done: @@ -219,7 +219,7 @@ if s.triggerComplete && s.current >= s.total { s.current = s.total s.completed = true - go b.refreshTillShutdown() + go b.forceRefreshIfLastUncompleted() } }: case <-b.done: @@ -371,12 +371,24 @@ } } -func (b *Bar) refreshTillShutdown() { - for { - select { - case b.container.refreshCh <- time.Now(): - case <-b.done: - return +func (b *Bar) forceRefreshIfLastUncompleted() { + var uncompleted int + b.container.traverseBars(func(bar *Bar) bool { + if b != bar { + if !bar.Completed() { + uncompleted++ + return false + } + } + return true + }) + if uncompleted == 0 { + for { + select { + case b.container.refreshCh <- time.Now(): + case <-b.done: + return + } } } } diff --git a/progress.go b/progress.go index f71f99b..7ebbea2 100644 --- a/progress.go +++ b/progress.go @@ -166,6 +166,23 @@ b.priority = priority heap.Fix(&s.bHeap, b.index) }: + case <-p.done: + } +} + +func (p *Progress) traverseBars(cb func(b *Bar) bool) { + done := make(chan struct{}) + select { + case p.operateState <- func(s *pState) { + for i := 0; i < s.bHeap.Len(); i++ { + bar := s.bHeap[i] + if !cb(bar) { + break + } + } + close(done) + }: + <-done case <-p.done: } }