On Dec 30, 2007, at 7:52 PM, Abraham Tio wrote: > need a class(we'll call it a 'simulator' since that's what i'm > attempting to write) to run a loop. > need that loop to stop when asked to, such as when the user that > started > it clicks a button to stop it. > > i write java that does this sort of thing all the time. > HOWEVER, when i try it in ruby, only bad things happen. > > check this out: > > ***start r.rb*** > class Simulator > attr_accessor :running > attr_accessor :sim_thread > def start > running = true self.running = true > > puts "starting simulator..." > sim_thread= Thread.new(){ > puts "sim thread started" > while(running) > 300000.times do |x| > x+=1 > end > puts 'did a buncha stuff a simulator might do' > Thread.pass > end > puts "sim thread stopped" > } > sim_thread.join > sim_thread > end > def stop > puts "stopping simulator..." > running = false self.running = false > > end > end > Thread.abort_on_exception = true > simulator = Simulator.new > thread = simulator.start > puts "started simulator, now we stop it.." > simulator.stop > ***end r.rb*** You have an attr_accessor :running but you were assigning to a running local variable. You need to either use @running = true or self.running = true> When ruby sees 'running = true' it decides that running is a local variable, so using running = does not set the @running ivar via the attr_acessor but self.running = true does. Cheers- - Ezra Zygmuntowicz -- Founder & Software Architect -- ezra / engineyard.com -- EngineYard.com