ルビーでストップウォッチプログラムを作りたかったので、ググってこのSOQを見つけました。
しかし、向こうでは、作成者は。を使用してtick
関数を呼び出します1000xxx.times
。(every second).times
のようなものを使用して、または秒単位でtick
関数を呼び出す方法を知りたいと思いました。
この関数:
def every_so_many_seconds(seconds)
last_tick = Time.now
loop do
sleep 0.1
if Time.now - last_tick >= seconds
last_tick += seconds
yield
end
end
end
このように使用する場合:
every_so_many_seconds(1) do
p Time.now
end
この結果:
# => 2012-09-20 16:43:35 -0700
# => 2012-09-20 16:43:36 -0700
# => 2012-09-20 16:43:37 -0700
秘訣は1秒未満寝ることです。それはあなたがダニを失うのを防ぐのに役立ちます。ダニを失うことが決してないことを保証することはできないことに注意してください。これは、オペレーティングシステムが、特権のないプログラムが必要なときにプロセッサ時間を取得することを保証できないためです。
したがって、クロックコードが毎秒呼び出されるブロックに依存しないようにしてください。たとえば、これは悪いことです。
every_so_many_seconds(1) do
@time += 1
display_time(@time)
end
これは問題ありません:
every_so_many_seconds(1) do
display_time(Time.now)
end
Thread.new do
while true do
puts Time.now # or call tick function
sleep 1
end
end