Ruby Timer
J'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...