Ezra Zygmuntowicz
12/31/2007 5:45:00 AM
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