Class Timer
In: lib/facets/supplemental/facets/timer.rb
Parent: Object

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 class method is also provided for easily timing the exectuion of a block.

  Timer.time do |timer|
   timer.total_time.round  #=> 0

   sleep 1
   timer.total_time.round  #=> 1

   timer.stop
   timer.total_time.round  #=> 1

   sleep 1
   timer.total_time.round  #=> 1

   timer.start
   timer.total_time.round  #=> 1

   sleep 1
   timer.total_time.round  #=> 2
  end

Thanks to Paul Brannan for TimeLimit and Minero Aoki for Timer. These two libraries served as models for building this class.

Methods

defuse   end_time   limit   new   on_timeout   reset   reset_limit   running?   start   start_time   stop   stopped?   time   total_time  

Classes and Modules

Class Timer::Dummy

Attributes

time_limit  [RW] 

Public Class methods

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 45
  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

Takes a block and returns the total time it took to execute.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 182
  def self.time
    yield( timer = Timer.new.start )
    return timer.total_time
  end

Public Instance methods

Kill time limit thread, if any.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 117
  def defuse
    if @timer_thread
      Thread.kill @timer_thread
      @timer_thread = nil
    end
  end

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 67
  def end_time
    @end_time
  end

Establish a time limit on execution.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 102
  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

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 72
  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.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 140
  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

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 155
  def reset_limit
    #stop
    #start
    defuse
    limit
  end

Queries whether the timer is still running.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 163
  def running?
    return @running
  end

Start the timer.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 82
  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

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 62
  def start_time
    @start_time
  end

Stops timer and returns total time. If timer was not running returns false.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 126
  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.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 168
  def stopped?
    return !@running
  end

Queries total recorded time of timer.

[Source]

# File lib/facets/supplemental/facets/timer.rb, line 173
  def total_time
    if running? then
      return @total_time + (Time.now - @start_time)
    else
      return @total_time
    end
  end

[Validate]