2010-10-19 11 views
3

Alors voici ce que je fais - j'ai un script Ruby qui imprime des informations à chaque minute. J'ai également mis en place un proc pour un piège de sorte que lorsque l'utilisateur clique sur ctrl-c, le processus s'interrompt. Le code ressemble à ceci:Une sorte de Ruby "Interruption"

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 

Maintenant, le code lui-même est valide et fonctionne bien, mais il fait beaucoup de travail inutile de vérifier la valeur de switch aussi souvent que possible. Il consomme autant de ressources processeur que possible (au moins 100% d'un cœur), ce qui représente un gaspillage considérable. Comment puis-je faire quelque chose de similaire, où un événement est mis à jour de temps en temps, sans gaspiller des tonnes de cycles?

Toute aide est appréciée et merci d'avance!

Répondre

4

Si vous emprisonnent juste ctrl-c interruptions et n » t l'esprit un peu d'attente entre les touches et sortir puis ...

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 

la fonction « veille » utilise les compteurs du système, donc ne pas utiliser la CPU en attendant. Si vous voulez une résolution plus fine juste remplacer sommeil 1 avec sommeil 0.5 ou même plus petit pour réduire le temps entre les contrôles,

6

Vous avez plusieurs solutions. L'un est d'utiliser un Thread :: Queue si vous attendez beaucoup de signaux et que vous voulez traiter chacun d'eux comme un événement, par exemple. Si vous êtes vraiment juste attendez^C pour arriver sans interactions complexes avec d'autres sujets, je pense qu'il peut être simple à utiliser Thread # wakeup:

c = Thread.current 

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

while true 
    sleep 
    puts "wake" 
end