Come notato nei commenti alla domanda, tutto quello che serve per farlo funzionare è che si uniscono sul filo:
#!/usr/bin/ruby1.8
def repeat_every(interval, &block)
loop do
start_time = Time.now
Thread.new(&block).join
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437822
# => 1266437827
# => 1266437832
...
Tuttavia, in quanto si trova , non c'è alcun motivo per utilizzare i thread per il codice nella questione:
def repeat_every(interval)
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437911
# => 1266437916
# => 1266437921
Ora, se quello che vuoi è un filo esimo fa qualcosa a intervalli, in modo che il programma principale possa fare qualcos'altro, quindi avvolgere l'intero ciclo in una discussione.
def repeat_every(interval)
Thread.new do
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
end
thread = repeat_every(5) do
puts Time.now.to_i
end
puts "Doing other stuff..."
thread.join
# => 1266438037
# => Doing other stuff...
# => 1266438042
# => 1266438047
fonte
2010-02-17 20:22:41
non riesco a immaginare come quel codice ha un senso ... I fili non sono mai uniti, in modo time_spent sarà sempre 0 e il ciclo pile appena su discussioni che corre parallela se ther carico di lavoro richiede più di 5 secondi. – hurikhan77
Grazie a hurikhan77, ti dispiace indicarmi un documento o un libro sui thread, quindi non devo fare domande stupide;)? – Elsanto
http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html –