2010-10-19 49 views
3

所以這就是我正在做的 - 我有一個ruby腳本,每分鐘打印一次信息。我還爲陷阱設置了一個proc,以便當用戶點擊ctrl-c時,該進程將中止。該代碼看起來是這樣的:某種紅寶石「中斷」

switch = true 

Signal.trap("SIGINT") do 
    switch = false 
end 

lastTime = Time.now 

while switch do 
    if Time.now.min > lastTime.min then 
     puts "A minute has gone by!" 
    end 
end 

現在的代碼本身是有效的,運行良好,但它做了很多無用功經常因爲它可以檢查switch值。它儘可能多地使用處理器(至少是一個內核的100%),所以它非常浪費。我怎樣才能做到類似這樣的事情:每隔一段時間更新一次事件,而不浪費大量週期?

所有幫助表示感謝,並提前致謝!

回答

4

如果你是剛剛捕獲CTRL-C中斷和Don」介意短暫的等待按下按鍵,它打破了,然後......之間

switch = true 

Signal.trap("SIGINT") do 
    switch = false 
end 

lastTime = Time.now 

while switch do 
    sleep 1 
    if Time.now.min > lastTime.min then 
     puts "A minute has gone by!" 
    end 
end 

「睡眠」功能,使用系統定時器,所以不使用了CPU在等待。如果你想要更精細的分辨率時間,只需更換睡眠1睡眠0.5或更小,以減少檢查之間的時間,

6

您有幾種解決方案。例如,如果您希望獲得許多信號並希望將它們中的每一個都作爲事件處理,則可以使用Thread :: Queue。如果你真的只是在等待^ C到與其他線程沒有複雜的相互作用發生,我認爲這可能是簡單的使用線程#喚醒:

c = Thread.current 

Signal.trap("SIGINT") do 
    c.wakeup 
end 

while true 
    sleep 
    puts "wake" 
end