Follow me
RSS feed
My sources
My Viadeo

Ruby Timer

Greg | 24 Dec 2009

SnippetsJ'ai profité du calme de cette période festive pour travailler sur mes projets. Le nombre de contributeurs sur Ruby/GraphViz augmentant, j'ai nous avons sorti une nouvelle version. Idem pour Capcode1 qui est passé en version 0.8.9. Mais le projet sur lequel j'ai passé le plus de temps est certainement RComet2.

- Mais pourquoi, sachant que tout cela devrait être rapidement déprécié par les WebSockets ?

Anyway !

Tout cela pour en arriver au fait que j'ai eu besoin de gérer le timeout des connexion dans RComet afin de détecter la déconnexion d'un client qui n'aurait pas eu la politesse de prévenir. Et pour cela je me suis amusé à développer une petite classe permettant de gérer un timer avec Ruby. Je vous la livre ici, mais sachez qu'il existe également un Gist

 1 require 'rubygems'
 2 require 'eventmachine'
 3  
 4 class Timer
 5   def initialize
 6     @run = false
 7     @timeout_proc = nil
 8   end
 9   
10   # Run <tt>blk</tt> every <tt>every</tt> seconds during <tt>during</tt> seconds 
11   def self.start( every = 1, during = 5, &blk )
12     t = Timer.new()
13     t.start( every, during, &blk )
14   end
15   
16   # Run <tt>blk</tt> every <tt>every</tt> seconds during <tt>during</tt> seconds 
17   def start( every = 1, during = 5, &blk )
18     @run = true
19     Thread.new do
20       time = Time.now
21       EventMachine.run do 
22         reschedule = proc { |inc, block| 
23           if Time.now - time > during
24             self.stop
25             @timeout_proc.call unless @timeout_proc.nil?
26           else
27             @timer = EM.add_timer(inc) { reschedule.call(inc, block) }
28             block.call 
29           end
30         }
31         @timer = EM.add_timer(every) { reschedule.call(every, blk) }
32         blk.call
33       end
34     end
35     return self
36   end
37   
38   # Timeout !
39   def timeout( &blk )
40     @timeout_proc = blk
41     return self
42   end
43   
44   # Stop the timer
45   def stop
46     EM.stop_event_loop if @run
47     @run = false
48     return self
49   end
50 end
51  
52 ## Example
53 if $0 == __FILE__
54   t = Timer.start(5, 20) { 
55     puts "Please, give me your name..."
56   }.timeout {
57     puts "Too late rabbit !!!"
58     exit 0
59   }
60  
61   r = $stdin.readline
62   puts "Hello #{r}"
63   
64   t.stop
65 end

1 Il n'y a pas autant de contibuteurs :(
2 Guillaume, si tu m'entend...

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.