class Timer

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
}

Attributes

end_time[R]
start_time[R]
time_limit[RW]

Public Class Methods

new( time_limit=nil, &block ) click to toggle source
# 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

defuse() click to toggle source

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
limit( time_limit=nil ) click to toggle source

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
on_timeout( &block ) click to toggle source
# File lib/more/facets/timer.rb, line 123
def on_timeout( &block )
  if block then
    @on_timeout = block
    true
  else
    false
  end
end
reset() click to toggle source

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
reset_limit() click to toggle source

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
running?() click to toggle source

Queries whether the timer is still running.

# File lib/more/facets/timer.rb, line 221
def running?
  return @running
end
start() click to toggle source

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
stop() click to toggle source

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
stopped?() click to toggle source

Queries whether the timer is still not running.

# File lib/more/facets/timer.rb, line 227
def stopped?
  return !@running
end
total_time() click to toggle source

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