class Timers::Timer
calling #cancel and resume normal operation by calling #reset.
been FIRED and is not recurring. You can manually enter this state by
if it also has a @handle specified. Otherwise it is either PAUSED or has
always connected to a Timer::Group but it would ONLY be in @group.timers
An individual timer set to fire a given proc at a given time. A timer is
def cancel
def cancel return unless @handle @handle.cancel! if @handle @handle = nil # This timer is no longer valid: @group.timers.delete(self) if @group end
def delay(seconds)
def delay(seconds) @handle.cancel! if @handle @offset += seconds @handle = @group.events.schedule(@offset, self) end
def fire(offset = @group.current_offset)
def fire(offset = @group.current_offset) if recurring == :strict # ... make the next interval strictly the last offset + the interval: reset(@offset) elsif recurring reset(offset) else @offset = offset end result = @block.call(offset, self) cancel unless recurring result end
def fires_in
def fires_in @offset - @group.current_offset if @offset end
def initialize(group, interval, recurring = false, offset = nil, &block)
def initialize(group, interval, recurring = false, offset = nil, &block) @group = group @interval = interval @recurring = recurring @block = block @offset = nil @handle = nil # If a start offset was supplied, use that, otherwise use the current timers offset. reset(offset || @group.current_offset) end
def inspect
def inspect buffer = to_s[0..-2] if @offset delta_offset = @offset - @group.current_offset if delta_offset > 0 buffer << " fires in #{delta_offset} seconds" else buffer << " fired #{delta_offset.abs} seconds ago" end buffer << ", recurs every #{interval}" if recurring end buffer << ">" return buffer end
def pause
def pause return if paused? @group.timers.delete self @group.paused_timers.add self @handle.cancel! if @handle @handle = nil end
def paused?
def paused? @group.paused_timers.include? self end
def reset(offset = @group.current_offset)
-
offset(Numeric) -- the duration to add to the timer.
def reset(offset = @group.current_offset) # This logic allows us to minimise the interaction with @group.timers. # A timer with a handle is always registered with the group. if @handle @handle.cancel! else @group.timers << self end @offset = Float(offset) + @interval @handle = @group.events.schedule(@offset, self) end
def resume
def resume return unless paused? @group.paused_timers.delete self # This will add us back to the group: reset end