5

ルビーでストップウォッチプログラムを作りたかったので、ググってこのSOQを見つけまし

しかし、向こうでは、作成者は。を使用してtick関数を呼び出します1000xxx.times(every second).timesのようなものを使用して、または秒単位でtick関数を呼び出す方法を知りたいと思いました。

4

2 に答える 2

16

この関数:

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
于 2012-09-20T23:47:17.767 に答える
13
Thread.new do
  while true do
    puts Time.now # or call tick function
    sleep 1
  end
end
于 2012-09-20T02:02:41.797 に答える