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