Trouble waiting X minutes

I am making a constant network connection that is feeding me
information, i want to take that information and place into nested /
two-dimensional array for 1 minute, below is the code that’s not
working.

class Test

def initialize
@junk = Array.new
@opensocket = TCPSocket.new(‘localhost’, 8080)
read
end

def read
while @lines = @opensocket.gets
FasterCSV.parse(@lines) do |@row|
pass
end
end
end

def pass
@junk << @row
sleep(60)
p @junk
end
end

enable = Test.new

So after I sleep for 1 minute you would think the @junk two dimensional
array has filled up but it hasn’t, what’s the best way to solve this
problem?

On Jul 14, 2010, at 8:28 AM, Tee D. [email protected] wrote:

I am making a constant network connection that is feeding me
information, i want to take that information and place into nested /
two-dimensional array for 1 minute, below is the code that’s not
working.

[snip]

So after I sleep for 1 minute you would think the @junk two dimensional
array has filled up but it hasn’t, what’s the best way to solve this
problem?

Well, I wouldn’t think that would be the case… Sleep suspends the
execution of your program until the timer expires, so nothing else is
happening during that time.

There are lots of ways that you could do what you want… Perhaps the
“simplest” way would be to capture the time in a variable before you
start, and check it after every row. If a minute has gone by, stop.
However, that won’t be terribly accurate and you won’t guarantee exactly
one minute.

Another option would be to start another thread to manage the timing,
but I’m not sure right off the top of my head what that would look like.

A third option might be to use the Timeout class, but that is sort of a
hack. You should read up on these options and pick one that works for
you.

ri Thread
ri Timeout

Ben

Tee D. wrote:

below is the code that’s not
working.

Your program doesn’t have any threads, so it will execute in lock-step.
That is, when you enter pass, you will sleep for 60 seconds there,
before returning.

Try adding some puts statements to see what’s going on, e.g.

class Test

def initialize

puts “start initialize”

@junk = Array.new
@opensocket = TCPSocket.new(‘localhost’, 8080)

puts “socket open”

read

puts “read has returned, done initialize”

end

def read

puts “start read”

while @lines = @opensocket.gets
FasterCSV.parse(@lines) do |@row|

puts “Read line #{@row.inspect}, going to pass”

    pass

puts “pass has returned”

end

end

puts “done read”

end

def pass

puts “starting pass”

@junk << @row

puts “sleeping for 60…”

sleep(60)
p @junk
end
end

enable = Test.new

You could alternatively try to use a debugger to single-step the
program, but generally I find the hassle of learning to drive the
debugger to be higher than putting the debug statements in.