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

Clo*_*one 3 ruby stopwatch rhodes

我想在红宝石中创建一个秒表程序,所以我用Google搜索并发现了这个问题.

但在那里,作者用tick函数调用了函数1000xxx.times.我想知道如何使用类似的东西(every second).times或者每秒增加一次调用tick函数.

Way*_*rad 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
Run Code Online (Sandbox Code Playgroud)

当像这样使用时:

every_so_many_seconds(1) do
  p Time.now
end
Run Code Online (Sandbox Code Playgroud)

结果如下:

# => 2012-09-20 16:43:35 -0700
# => 2012-09-20 16:43:36 -0700
# => 2012-09-20 16:43:37 -0700
Run Code Online (Sandbox Code Playgroud)

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

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

every_so_many_seconds(1) do
  @time += 1
  display_time(@time)
end
Run Code Online (Sandbox Code Playgroud)

这没关系:

every_so_many_seconds(1) do
  display_time(Time.now)
end
Run Code Online (Sandbox Code Playgroud)

  • @WayneConrad循环时间不是100毫秒,而是100毫秒+额外的计算时间.每次循环评估时,舍入误差都会增加,并且时间会慢慢漂移.当我的机器每秒运行此功能显示"tick"时,10分钟后我有1秒的差异.显示了599`tick`.应该有600.对于一个短暂的生活过程,这是完全正常的,但对于长期生活的服务器进程,它可能是一个问题.通过执行`last_tick + = seconds`,可以确保最大漂移为"睡眠"时间:100ms. (2认同)

小智 9

Thread.new do
  while true do
    puts Time.now # or call tick function
    sleep 1
  end
end
Run Code Online (Sandbox Code Playgroud)