【问题标题】:how to invoke a method for every second in ruby如何在红宝石中每秒调用一个方法
【发布时间】:2012-09-20 01:17:37
【问题描述】:

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

但是在那边,作者用1000xxx.times调用了tick函数。我想知道如何使用(every second).times 之类的方法来实现,或者每增加一秒,请调用tick 函数。

【问题讨论】:

  • 我不确定我是否完全理解您的要求。你能澄清一下吗?
  • 在 Ruby 中,Time 类中有 succ 之类的东西。 t = Time.now #=> 2007-11-19 08:23:57 -0600 t.succ #=> 2007-11-19 08:23:58 -0600 这显示下一秒时间。我想递归地做。
  • 我想在屏幕上显示每增加一秒的时间。

标签: ruby rhodes stopwatch


【解决方案1】:

这个函数:

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

【讨论】:

  • 如果我使用every_so_many_seconds(1) do p Time.now end 它每秒显示多次 为什么会这样?你能解释一下吗?
  • @clone,我在编辑过程中引入了该错误(并且像个傻瓜一样,我没有测试它)。现在已经修好了。
  • 感谢您的回答! :) +1
  • 为什么不用last_tick += seconds 而不是last_tick = Time.now?会更准确。
  • @WayneConrad 循环时间不完全是 100 毫秒,而是 100 毫秒 + 额外的计算时间。每次循环评估时,舍入误差都会增加,时间会慢慢漂移。在我的机器上运行此函数以每秒显示 tick 时,10 分钟后我有 1 秒的差异。显示了 599 个tick。应该有 600 个。对于一个短暂的进程来说,这完全没问题,但对于一个长期存在的服务器进程来说,这可能是个问题。通过执行last_tick += seconds,您可以确保最大漂移将是sleep 时间:100 毫秒。
【解决方案2】:
Thread.new do
  while true do
    puts Time.now # or call tick function
    sleep 1
  end
end

【讨论】:

  • 谢谢 我最后还需要显示经过的时间,我应该在某处记录时间,以便在秒表停止时恢复操作很有用。
  • 可能在做 puts Time.now 之前我应该​​将它存储在某个 var t 然后 puts t 会这样做.. 我对吗? :-/
  • 你是对的。此外,如果您正在开发时钟应用程序,您可能希望使用较低的睡眠值(例如 0.1),将上次运行的时间存储在变量中,并且仅当它大于先前(模秒)时才输出新值,否则您的时钟将“跳跃” " 有时。
  • 我不喜欢这个答案,因为你不可避免地会浪费时间;例如在 1M 循环之后,将花费超过 1M 秒。
  • 从技术上讲,任何其他回调/超时系统都将使用内部休眠的线程。请注意,睡眠时睡眠不会消耗 CPU 周期。
猜你喜欢
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 2014-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多