From: Brian Candler Date: 2009-12-17T00:09:15+09:00 Subject: Re: Using threads to show progress # A suggestion class Progress def initialize(out = STDERR, interval = 0.5) @out = out @interval = interval @timestamp = nil @category = nil end def bar(category, n, m) @out << sprintf("%-20s[%-56s]", category, "*" * (56.0 * n / m)) end # Progress << ["Baking", 53, 100] # Progress << "Finished" def <<(data) return if data.is_a?(Array) && data[0] == @category && @timestamp && Time.now < @timestamp @timestamp = Time.now + @interval if data.is_a?(Array) && data[0] == @category @out << "\r" bar(*data) return end if @category @out << "\r" bar(@category, 100, 100) @out << "\r\n" end if data.is_a?(Array) @category = data[0] bar(*data) else @category = nil @out << data << "\r\n" end end def self.<<(data) @progress ||= new @progress << data end end if __FILE__ == $0 Progress << "Feeding the cat" 33.times do |x| Progress << ["munch", x, 33] sleep(0.1) end Progress << "Put the cat out" Progress << "Go to sleep" 20.times do |x| Progress << ["zzzzzzz", x, 20] sleep(0.2) end Progress << "Wakey wakey!" end -- Posted via http://www.ruby-forum.com/.