2009-12-22 16 views
6

Ayrı bir iş parçacığını başka bir iş parçacığı içinden nasıl başlatırım ve durdururum?Ruby'nin Başlatma ve Durdurma Konuları

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 

cevap

8

İşte örnek bir tamir sürümü:

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 

Konu yönetimi biraz yanıltıcı olabilir. Bir iş parçacığı durdurmak onu sonlandırmaz, sadece zamanlayıcıdan kaldırır, bu yüzden gerçekten Thread # sonlandırma ile onu öldürmeniz gerekir! gerçekten bitmeden önce.

+1

Ahh, bu çok daha anlamlı, teşekkürler. Yine de, ilk kez ne gibi merak ettim, 'STDOUT.sync = true' için. Yine de anlayacağım. – RyanScottLewis

+0

Hm, 'gets' yönteminin çalışması durduruyor. Bununla n'aber? – RyanScottLewis

+0

Yukarıdaki kodla ilgili sorun yok gibi görünüyor. Bunu sorunsuzca halledebilirim. Loop_a'da ne yaptığınızdan şüpheleniyorum (# Do şeyler) loop_a'yı durdurabilir. – bryantsai

İlgili konular