2013-04-09 36 views
1

我試圖每隔30秒檢查一次火情。我還沒有找到一個明確的方式來與Ruby做到這一點。嘗試這樣的事情目前:執行一定的時間間隔的循環或滿足條件

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

問題有類似的東西是它使用的睡眠,它停止線程在其軌道上的一整秒。有沒有另一種方式來實現類似於上述的東西,而不使用睡眠?有沒有辦法在基於時間的時間間隔上有一些循環?

+2

擺脫計數器變量,並使用'for 1..30'或'1.upto(30)'或'(1..30).each'。 – meagar 2013-04-09 03:34:41

+1

在等待時,你希望用線程做些什麼?如果您嘗試檢查某些內容,請查看[IO#select](http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-select) IO,如果不在那裏,則做其他事情。從上面的代碼中不清楚是否有其他處理要做。睡覺沒有任何天生的錯誤。 – 2013-04-09 03:35:24

+0

對不起,有問題。我正在運行事件驅動/多線程的基於事件的機器人。我想檢查一個條件是否發生在觸發循環的事件的30秒窗口內。我希望在30秒內相當頻繁地進行檢查(1秒或24秒)。條件在另一個事件中更新/發生,我希望這個循環根據出現/未出現的條件來檢查和執行反應。 – 2013-04-09 14:10:17

回答

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

我認爲這實際上完成了我所要做的事情,但我並不知道在一段時間內添加一個整數值就相當於花費了幾秒鐘的時間。謝謝 – 2013-04-11 00:39:20

+2

這比睡覺更糟糕,因爲它會固定您的CPU。 – 2015-07-06 23:26:12

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或更大。有些事情經過毫秒處理,這會給你一個選項,可以節省處理週期。適用於圖形處理。