2010-10-19 46 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