2009-12-22 12 views
6

Wie würde ich einen separaten Thread innerhalb eines anderen Threads starten und stoppen?Starten und Stoppen von Ruby-Threads

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 

Antwort

8

Hier ist eine reparierte Version Ihres Beispiel:

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 

Thread-Management ein bisschen schwierig sein kann. Das Stoppen eines Threads beendet ihn nicht, sondern entfernt ihn einfach aus dem Scheduler, sodass Sie ihn eigentlich mit Thread # terminieren abbrechen müssen! bevor es wirklich fertig ist.

+1

Ahh, das macht viel mehr Sinn, danke. Obwohl ich mich gefragt habe, was der erste mag, war "STDOUT.sync = true". Ich werde es herausfinden. – RyanScottLewis

+0

Hm, es scheint, die 'gets'-Methode stoppt die Ausführung von loop_a. Was ist damit los? – RyanScottLewis

+0

Mit dem obigen Code scheint es kein Problem zu geben. Ich kann das ohne Probleme ausführen. Ich vermute, was Sie in loop_a getan haben (das # Do-Zeug), könnte loop_a anhalten. – bryantsai

Verwandte Themen