ActionTimer is a helper for timed events. It allows for single and recurring actions to be executed in an efficient manner. It makes use of a single thread to keep time on registered actions and uses an ActionPool to execute actions. Simple and effective.
gem install actiontimer
git clone http://github.com/spox/actiontimer.git cd actiontimer && gem build *.gemspec && gem install ./
rip makes it easy to install directly from a github repository.
ActionTimer is currently tested on:
-
Ruby 1.8.6-p383
-
Ruby 1.8.7-p248
-
Ruby 1.9.1-p376
-
JRuby 1.4.0
require 'actiontimer' timer = ActionTimer::Timer.new timer.add(:period => 1){ puts "#{Time.now}: This is timed every 1 second." } timer.add(:period => 2){ puts "#{Time.now}: This is timed every 2 seconds." } loop do puts "#{Time.now}: Main loop sleeps for 3 seconds." sleep(3) end => 2010-01-05 17:52:46 -0800: Main loop sleeps for 3 seconds. 2010-01-05 17:52:47 -0800: This is timed every 1 second. 2010-01-05 17:52:48 -0800: This is timed every 1 second. 2010-01-05 17:52:48 -0800: This is timed every 2 seconds. 2010-01-05 17:52:49 -0800: Main loop sleeps for 3 seconds. 2010-01-05 17:52:49 -0800: This is timed every 1 second. 2010-01-05 17:52:50 -0800: This is timed every 1 second. 2010-01-05 17:52:50 -0800: This is timed every 2 seconds. 2010-01-05 17:52:51 -0800: This is timed every 1 second. 2010-01-05 17:52:52 -0800: Main loop sleeps for 3 seconds.
What if you want to sleep for less than a second? Well, sure we can do that:
require 'actiontimer' result = 0 timer = ActionTimer::Timer.new timer.add(:period => 0.1){ result += 1 } sleep(1.01) p result => 10
How about passing data to your block:
require 'actiontimer' data = :foobar timer = ActionTimer::Timer.new timer.add(:period => 0.01, :once => false, :data => data){|x| puts "Data: #{x}" } data = :fubar p data sleep(0.011) p data => :fubar Data: foobar :fubar
Or maybe you don’t want the timer to start right away:
require 'actiontimer' timer = ActionTimer::Timer.new(:auto_start => false) output = 0 timer.add(:period => 0.1){ output += 1 } sleep(1) p output timer.start sleep(1.01) p output => 0 10
What if you want to add multiple actions at one time? We can do this:
require 'actiontimer' timer = ActionTimer::Timer.new result = 0 actions = [] actions << ActionTimer::Action.new(:timer => timer, :period => 0.1){ result += 1} actions << ActionTimer::Action.new(:timer => timer, :period => 0.2){ result += 1} actions << ActionTimer::Action.new(:timer => timer, :period => 0.3){ result += 1} timer.register(actions) sleep(0.41) p result => 7
If you find any bugs, please report them through github. If you are in need of any help, you can generally find me on DALnet and Freenode.
ActionPool is licensed under the LGPLv3 Copyright (c) 2009 spox <spox@modspox.com>