如何在ruby中调用每秒的方法

我想在ruby中创建一个秒表程序,所以我用Google搜索并找到了这个SO Q.

但在那里,作者用1000xxx.times调用tick函数。 我想知道如何使用类似(every second).times来执行此操作(every second).times或者(every second).times的每个增量都调用tick函数。

 Thread.new do while true do puts Time.now # or call tick function sleep 1 end end 

这个function:

 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 

诀窍是睡不到一秒钟。 这有助于防止你失去蜱虫。 请注意,您不能保证永远不会丢失。 那是因为操作系统无法保证您的非特权程序在需要时获得处理器时间。

因此,请确保您的时钟代码不依赖于每秒调用的块。 例如,这会很糟糕:

 every_so_many_seconds(1) do @time += 1 display_time(@time) end 

这没关系:

 every_so_many_seconds(1) do display_time(Time.now) end