2013-04-09 3 views
1

Я пытаюсь проверить огонь каждую секунду в течение 30 секунд. Я еще не нашел четкого способа сделать это с Ruby. Пытаясь что-то вроде этого в настоящее время:Выполните цикл для определенного интервала времени или при выполнении условия

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

Проблема с чем-то вроде, что он должен использовать сон, который останавливает поток в своих треках на целую секунду. Есть ли другой способ добиться чего-то подобного выше, без использования сна? Есть ли способ иметь что-то цикл, хотя на временной интервал?

+2

Избавьтесь от переменной счетчика и используйте либо 'for i в 1..30', либо' 1.upto (30) 'или' (1..30) .each'. – meagar

+1

Что вы надеетесь сделать с потоком во время ожидания? Возможно, вы захотите проверить что-то вроде [IO # select] (http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-select), если вы пытаетесь проверить IO и сделать что-то еще, если его там нет. Из вашего кода неясно, есть ли какая-либо другая обработка. Ничего из того, что сон не имеет ничего общего. –

+0

Извините за туманность в вопросе. Я запускаю бот, основанный на событиях, который управляется событиями/многопоточными. Я хотел проверить, происходит ли условие в течение 30 секунд окна события, вызвавшего цикл. Я хотел делать чек довольно часто (1 секунда или os интервалы) в течение этих 30 секунд. Условие обновляется/происходит в другом событии, и я хочу, чтобы этот цикл проверял и выполнял реакцию на основе этого условия, возникающего/не возникающего. –

ответ

4

Вы можете приблизить то, что вы ищете что-то вдоль этих линий:

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 
+0

Я думаю, что это на самом деле выполнило то, что я собирался сделать, я не знал, что добавление целочисленного значения в какое-то время было эквивалентом времени для показа секунд. Спасибо –

+2

Это хуже, чем спать, хотя он будет привязывать ваш процессор. –

0

вы можете попробовать это позволяет интервального управления

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 секунд интервал может быть установлен на любое значение 1 или больше. Некоторые вещи обрабатываются через миллисекунды, это даст вам вариант, который позволит вам сэкономить циклы при обработке. Хорошо работает при обработке графики.