2009-12-22 11 views
6

¿Cómo puedo iniciar y detener un subproceso independiente desde otro subproceso?Iniciar y detener subprocesos de ruby ​​

loop_a_stopped = true 
loop_a = Thread.new do 
    loop do 
     Thread.stop if loop_a_stopped 

     # Do stuff 

     sleep 3 
    end 
end 

loop_b = Thread.new do 
    loop do 
     response = ask("> ") 
     case response.strip.downcase 
      when "start" 
       loop_a_stopped = false 
       loop_a.run 
      when "stop" 
       loop_a_stopped = true 
      when "exit" 
       break 
     end 
    end 
end 

loop_a.join 
loop_b.join 

Respuesta

8

Aquí hay una versión reparada de su ejemplo:

STDOUT.sync = true 

loop_a_stopped = true 

loop_a = Thread.new do 
    loop do 
     Thread.stop if loop_a_stopped 

     # Do stuff 

     sleep(1) 
    end 
end 

loop_b = Thread.new do 
    loop do 
     print "> " 
     response = gets 

     case response.strip.downcase 
     when "start" 
      loop_a_stopped = false 
      loop_a.wakeup 
     when "stop" 
      loop_a_stopped = true 
     when "exit" 
      # Terminate thread A regardless of state 
      loop_a.terminate! 
      # Terminate this thread 
      Thread.exit 
     end 
    end 
end 

loop_b.join 
loop_a.join 

gestión de rosca puede ser un poco complicado. Detener un hilo no lo termina, simplemente lo elimina del programador, por lo que realmente tiene que matarlo con Thread # terminate! antes de que esté realmente terminado.

+1

Ahh, esto tiene mucho más sentido, gracias. Aunque, me preguntaba cómo era la primera, 'STDOUT.sync = true '. Lo resolveré sin embargo. – RyanScottLewis

+0

Hm, parece que el método 'gets' evita que loop_a se ejecute. ¿Qué pasa con esto? – RyanScottLewis

+0

Parece que no hay problema con el código anterior. Puedo ejecutar esto sin problema. Sospecho que lo que hiciste en loop_a (el # Do stuff) podría detener loop_a. – bryantsai

Cuestiones relacionadas