Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在特定的时间间隔或满足条件时执行循环_Ruby_Loops_Time_Ruby 1.9_Ruby 2.0 - Fatal编程技术网

Ruby 在特定的时间间隔或满足条件时执行循环

Ruby 在特定的时间间隔或满足条件时执行循环,ruby,loops,time,ruby-1.9,ruby-2.0,Ruby,Loops,Time,Ruby 1.9,Ruby 2.0,我试着在30秒内每秒钟检查一次火。我还没有找到一个用Ruby做这件事的清晰方法。目前正在尝试类似的操作: until counter == 30 sleep 1 if condition do something break else counter +=1 end 这样做的问题是它必须使用sleep,这会使线程停止运行整整一秒钟。有没有其他方法可以在不使用睡眠的情况下实现类似上述目标?有没有一种方法可以让某个东西在一个基于时间的间隔内循环?您可以通过以

我试着在30秒内每秒钟检查一次火。我还没有找到一个用Ruby做这件事的清晰方法。目前正在尝试类似的操作:

until counter == 30
  sleep 1
  if condition
    do something
    break
   else
     counter +=1
end

这样做的问题是它必须使用sleep,这会使线程停止运行整整一秒钟。有没有其他方法可以在不使用睡眠的情况下实现类似上述目标?有没有一种方法可以让某个东西在一个基于时间的间隔内循环?

您可以通过以下方式大致了解您想要的东西:

now = Time.now
counter = 1
loop do
  if Time.now < now + counter
    next
  else
    puts "counting another second ..."
  end
  counter += 1
  break if counter > 30
end
now=Time.now
计数器=1
环道
如果Time.now30时中断
结束

您可以通过以下方式大致了解您要查找的内容:

now = Time.now
counter = 1
loop do
  if Time.now < now + counter
    next
  else
    puts "counting another second ..."
  end
  counter += 1
  break if counter > 30
end
now=Time.now
计数器=1
环道
如果Time.now30时中断
结束

您可以尝试此方法,因为它允许间隔控制

counter == 30
interval = 5 # Check every 5 seconds
interval_timer = 1 # must start at 1
now = Time.now
while Time.now - now < counter
    if interval_timer % interval == 0 #Every 5 attempts the activity will process
        if condition
            stuff
        end
    end
    process_timer = process_timer + 1
end
计数器==30
间隔=5#每5秒检查一次
间隔计时器=1#必须从1开始
现在=时间
while Time.now-now<计数器
如果interval_timer%interval==0#每5次尝试,活动将处理一次
如果条件
东西
结束
结束
进程计时器=进程计时器+1
结束

这将在保证的30秒内发生。间隔可设置为任何值1或更大。有些事情是通过毫秒处理的,这会给你一个选项,可以节省你的处理周期。在图形处理中效果很好。

您可以尝试使用它,它允许间隔控制

counter == 30
interval = 5 # Check every 5 seconds
interval_timer = 1 # must start at 1
now = Time.now
while Time.now - now < counter
    if interval_timer % interval == 0 #Every 5 attempts the activity will process
        if condition
            stuff
        end
    end
    process_timer = process_timer + 1
end
计数器==30
间隔=5#每5秒检查一次
间隔计时器=1#必须从1开始
现在=时间
while Time.now-now<计数器
如果interval_timer%interval==0#每5次尝试,活动将处理一次
如果条件
东西
结束
结束
进程计时器=进程计时器+1
结束

这将在保证的30秒内发生。间隔可设置为任何值1或更大。有些事情是通过毫秒处理的,这会给你一个选项,可以节省你的处理周期。在图形处理方面效果很好。

您可以做一些简单的事情,如

max_runtime = 10.seconds.from_now
puts 'whatever' until Time.now > max_runtime

你可以做一些简单的事情,比如

max_runtime = 10.seconds.from_now
puts 'whatever' until Time.now > max_runtime

去掉计数器变量,对1..30中的i使用
1.最多(30)
(1..30)。每个
。在等待时,您希望对线程执行什么操作?你可能想检查一些东西,比如,如果你试图检查IO,如果它不在那里,就做一些其他的事情。从上面的代码中不清楚是否还有其他处理要做。睡觉本身并没有什么不好。抱歉,我的问题含糊不清。我正在运行一个基于事件的bot,它是事件驱动/多线程的。我想检查触发循环的事件是否在30秒内发生。我想在30秒内经常检查(1秒或操作系统间隔)。条件在另一个事件中更新/发生,我希望此循环检查并根据出现/未出现的条件执行反应。睡眠导致延迟/无法触发此循环所处的事件。事件本身有许多导致不同响应的条件,这就是我不想使用slleep路由的原因。去掉计数器变量,在1..30
1中为I使用
。最多(30)
(1..30)。每个
。您希望在等待时对线程做什么?你可能想检查一些东西,比如,如果你试图检查IO,如果它不在那里,就做一些其他的事情。从上面的代码中不清楚是否还有其他处理要做。睡觉本身并没有什么不好。抱歉,我的问题含糊不清。我正在运行一个基于事件的bot,它是事件驱动/多线程的。我想检查触发循环的事件是否在30秒内发生。我想在30秒内经常检查(1秒或操作系统间隔)。条件在另一个事件中更新/发生,我希望此循环检查并根据出现/未出现的条件执行反应。睡眠导致延迟/无法触发此循环所处的事件。事件本身有许多导致不同响应的条件,这就是我不想使用slleep路由的原因。我认为这实际上完成了我要做的事情,我不知道向时间添加整数值等于向时间添加秒数。谢谢这比睡觉更糟糕,因为它会固定你的CPU。我想这实际上完成了我要做的事情,我不知道在时间上加一个整数值等于在时间上加上秒数。谢谢这比睡觉更糟糕,因为它会固定你的CPU。