To sleep no more

hi all,

I’m a ruby noop trying his first steps. I’d like a little advice.

What I want to make is the following.

An object Chicken

  • its attribute starts as ‘egg’
  • after x times sleep() it the attribute gets the value chicken
  • x times sleep later the object can make a call to make a new
    instance of chicken (creating another egg)

I could make a method to change the attribute and call this from my
main program.
In other words my sleep method would be in my main program and call
the objects method.
I was wondering if it would be possible to keep the sleep in the
object.
(Since I was planning on creating some other animals as well, each
with a special amount of time needed to go to the next step.)

I think it’s called threads in ruby but I’m not sure. (if it’s called
threads is this the way to handle this problem? Does it act like an
Ajax call?)

Many thnx

DrBenway

On Friday 25 January 2008 13:25:00 DrBenway wrote:

instance of chicken (creating another egg)
I think it’s called threads in ruby but I’m not sure. (if it’s called
threads is this the way to handle this problem? Does it act like an
Ajax call?)

Many thnx

DrBenway

Something like this might work for your purposes:

class Animal
attr_reader :incubation_period, :maturation_period, :from_type,
:to_type, :current_type, :slept, :children

    def initialize(i_period = 60, m_period = 120, from = "egg", to

= “chicken”)
@incubation_period = i_period
@maturation_period = m_period
@slept = 0
@from_type = from
@to_type = to
@current_type = @from_type
@children = []
end

    def mysleep(seconds = @incubation_period)
            @slept += sleep(seconds)
            if @slept >= @incubation_period
                    @current_type = @to_type
            end
    end

    def give_birth(count = 1)
            if @slept >= @maturation_period
                    for number in children.length..(children.length 

count - 1)
puts “I had another child.”
children[number] =
Animal.new(@incubation_period, @maturation_period, @from_type,
@to_type);
end
else
puts “I’m too young to give birth.”
end
end
end

snake = Animal.new(5, 10, “egg”, “snake”)
snake.mysleep(4)
puts snake.current_type
snake.give_birth
snake.mysleep(4)
puts snake.current_type
snake.give_birth
snake.mysleep(4)
puts snake.current_type
snake.give_birth(5)

On Jan 25, 8:27 pm, Stephen K. [email protected] wrote:

An object Chicken
object.

            @slept = 0
            end
            else

puts snake.current_type
snake.give_birth
snake.mysleep(4)
puts snake.current_type
snake.give_birth(5)

Wow thnx Stephen for coocking up an example so fast :slight_smile:
That’s indeed what I was planning to do.

The only thing that may not have been very obvious (sorry for this) in
my example above was:
Is there a way to take the snake.mysleep(4) out of our main program
and put it in the class/object itself
That way I call snake = Animal.new(5, 10, “egg”, “snake”) once and
from then on it leads a life on its own (that’s what got me to think
that I needed threads).
Same goes for all the other snakes that get born from the first.
I don’t feel like messing with arrays of
snakes,pigs,boars,chickens,… out of the classes

On Jan 25, 2008 12:19 PM, DrBenway [email protected] wrote:

Wow thnx Stephen for coocking up an example so fast :slight_smile:
That’s indeed what I was planning to do.

That way I call snake = Animal.new(5, 10, “egg”, “snake”) once and
from then on it leads a life on its own (that’s what got me to think
that I needed threads).

You could do something like:

class Animal
def initialize(i_period = 60, m_period = 120, from = “egg”, to
= “chicken”)
@incubation_period = i_period
@maturation_period = m_period
@slept = 0
@from_type = from
@to_type = to
@current_type = @from_type
@children = []
Thread.run do
while true do
mysleep(1)
end
end
end

As a start, anyway. Much better to rejigger the whole thing so that
the thread looks like

Thread.run do
sleep(incubation_period)
born
sleep(maturation_period)
mature
sleep(adult_lifetime)
die
end

Also, it seems pretty obvious that you should do different species as
subclasses of Animal, so that:

class Snake < Animal
def incubation_period; 5; end

def maturation_period; 10; end

def adult_lifetime; 15; end

def born; @state=“snake”; end
#etc, etc
end

menagerie = []
Snake.new(menagerie)
Deer.new(menagerie)
Fox.new(menagerie)
sleep 6
menagerie.each {|animal| animal.give_birth} => “Snake 1: I had 150
children. Deer 1: I had 1 child. Fox 1: I’m too young to reproduce”

Granted, incomplete as it stands, but there’s a direction there.

hi,

ok let’s code a zoo. threads is what you are looking for, but there
might be a better way. but threads first.

class Animal

def initialize
@lifetime_in_sec = 0
@dead = false
thread = Thread.new do
until @dead
@lifetime_in_sec += 1
sleep 1
end
end
end

def kill
@dead = true
end

end

depending on your zoo this might lead to a lot of threads, so maybe
you should think about using a more event-based design. (make the egg
by initialization register a ‘timed’ event to become a biddy.)

shutdown = true
$events = Hash.new { |hash, key| hash[key] = [] }
$time = 0

class Animal
def initialize
$events[$time+time_to_become_a_biddy] << self
end
def progress
# become a biddy or chicken or …
$events[$time+time_to_become_a_chicken] << self if @state==:biddy
end
end

event_handler = Thread.new do
counter = 0
until shutdown
counter += 1
$events[counter].each { |animal| animal.progress }
end
end

this way your simulation is calucaluatet as fast as possible and you
can throttle it to be realtime. asuming your machine is fast enough
for your zoo. :wink:

g phil

On Friday 25 January 2008 15:19:58 DrBenway wrote:

  • after x times sleep() it the attribute gets the value chicken
    with a special amount of time needed to go to the next step.)
            @from_type = from
    end
                    puts "I'm too young to give birth."

snake.give_birth
and put it in the class/object itself
That way I call snake = Animal.new(5, 10, “egg”, “snake”) once and
from then on it leads a life on its own (that’s what got me to think
that I needed threads).
Same goes for all the other snakes that get born from the first.
I don’t feel like messing with arrays of
snakes,pigs,boars,chickens,… out of the classes

Ah, now I understand. Yes, if you want each Animal to be able to run
through
its lifecycle independently and concurrently, you’d need to use threads.
The
example class above would be simplified by the fact that each Animal
would be
responsible for its own lifecycle. The constructor would just need to
sleep
for the incubation period, update its current type, sleep for the
maturation
period minus the incubation period (if any), give birth (spawning other
threads and creating other Animals), and then die at some point. You can
find
some info on using threads in Ruby here:
http://www.ruby-doc.org/docs/ProgrammingRuby/

Stephen K.
Network Engineer
CTI Networks, Inc.

On Jan 25, 9:54 pm, Judson L. [email protected] wrote:

            @current_type = @from_type

As a start, anyway. Much better to rejigger the whole thing so that

def born; @state=“snake”; end

Granted, incomplete as it stands, but there’s a direction there.


Your subnet is currently 169.254.0.0/16. You are likely to be eaten by a grue.

This is indeed what I needed. Many thnx

On Jan 25, 10:11 pm, Philipp H. [email protected] wrote:

thread = Thread.new do

class Animal
counter = 0
g phil

I was wondering if it would be possible to keep the sleep in the
DrBenway
@maturation_period = m_period
@current_type = @to_type
end
snake.mysleep(4)
my example above was:
Is there a way to take the snake.mysleep(4) out of our main program
and put it in the class/object itself
That way I call snake = Animal.new(5, 10, “egg”, “snake”) once and
from then on it leads a life on its own (that’s what got me to think
that I needed threads).
Same goes for all the other snakes that get born from the first.
I don’t feel like messing with arrays of
snakes,pigs,boars,chickens,… out of the classes

Thnx for the example Philipp.
The first one I get, but the second makes my head spin :slight_smile:
To much of a Ruby/OOP noob I guess :slight_smile: