class Delayer def initialize @list = Hash.new end def register(date, &prc) (@list[date] ||= []) << prc end def run while not @list.empty? while (date = @list.keys.min) > Time.now sleep date.to_f - Time.now.to_f end a = @list.delete(date) a.each { |p| p.call } end end end d = Delayer.new d.register(Time.now + 40) { puts "40s ont passé depuis le début du script" } d.register(Time.now + 10) { puts "10 secondes ont passé depuis le début du script" ; d.register(Time.now + 20) { puts "20 secondes de plus depuis les 10" } } d.run