Timer
Provides a strightforward means for controlling time critical execution. Can be used as a "stop watch" timer or as a "time bomb" timer.
t = Timer.new(10) { raise TimeoutError, "timeout!" } t.start : # done within 10sec timeout t.stop t.start : if condition then t.reset #--> restart timer end
A Kernel method is also provided for easily timing the exectuion of a block.
timed { |timer| timer.total_time.round #=> 0 sleep 1 timer.total_time.round #=> 1 timer.stop timer.total_time.round #=> 1 sleep 2 timer.total_time.round #=> 1 timer.start timer.total_time.round #=> 1 sleep 1 timer.total_time.round #=> 2 }
Methods
defuse
limit
new
on_timeout
reset
reset_limit
running?
start
stop
stopped?
total_time
Classes and Modules
Class Timer::DummyAttributes
[R] | end_time | |
[R] | start_time | |
[RW] | time_limit |
Public Class methods
[ + ]
# File lib/more/facets/timer.rb, line 110 def initialize( time_limit=nil, &block ) # standard timer @start_time = nil @end_time = nil @total_time = 0 @runnning = nil # for using time limit @time_limit = time_limit @on_timeout = block @current_thread = nil @timer_thread = nil end
Public Instance methods
Kill time limit thread, if any.
[ + ]
# File lib/more/facets/timer.rb, line 171 def defuse if @timer_thread Thread.kill @timer_thread @timer_thread = nil end end
Establish a time limit on execution.
[ + ]
# File lib/more/facets/timer.rb, line 155 def limit( time_limit=nil ) if @time_limit || time_limit @current_thread = Thread.current @timer_thread = Thread.fork { sleep @time_limit if @on_timeout then @on_timeout.call @time_limit else @current_thread.raise TimeoutError, "#{@time_limit} seconds past" end } end end
[ + ]
# File lib/more/facets/timer.rb, line 123 def on_timeout( &block ) if block then @on_timeout = block true else false end end
Stops and resets the timer. If the timer was running returns the total time. If not returns 0.
[ + ]
# File lib/more/facets/timer.rb, line 196 def reset if running? r = stop else r = 0 end @total_time = 0 return r end
Resets the time limit. Same as:
t.stop t.start
[ + ]
# File lib/more/facets/timer.rb, line 212 def reset_limit #stop #start defuse limit end
Queries whether the timer is still running.
[ + ]
# File lib/more/facets/timer.rb, line 221 def running? return @running end
Start the timer.
[ + ]
# File lib/more/facets/timer.rb, line 134 def start @running = true @start_time = Time.now limit if @time_limit self #if block_given? then # begin # yield( self ) # ensure # stop # end #else # @time_limit #end end
Stops timer and returns total time. If timer was not running returns false.
[ + ]
# File lib/more/facets/timer.rb, line 181 def stop if @running defuse # record running time @end_time = Time.now @running = false @total_time += (@end_time - @start_time) else nil end end
Queries whether the timer is still not running.
[ + ]
# File lib/more/facets/timer.rb, line 227 def stopped? return !@running end
Queries total recorded time of timer.
[ + ]
# File lib/more/facets/timer.rb, line 233 def total_time if running? then return @total_time + (Time.now - @start_time) else return @total_time end end