Sleep in a multithreaded environment

Hi,
I’m trying to control an external process I’m running and quit it in
case it got
stuck.
To do that I have to check that the external exe keeps writing on
stdout, if it doesn’t update it for a while I’ll quit it.
I came up with the following code (using threads) but the sleep in the
main thread blocks everything. (The same code works under Mac OSX)
Is there something I’m doing wrong?
Or a better way to achieve what I need?
Thanks a lot in advance

n = 0
t1 = Thread.new
{
begin
IO.popen(“executable.exe”) do |pipe|
pipe.each("\r") do |line|
puts line
n += 1
end
end
end
}

k = 0
while t1.alive?
sleep(10) # DOESN’T SEEM TO WORK ON WINDOWS
if k == n
puts “DEAD”
t1.raise(“close”)
end
k = n
end

On Mon, Jun 30, 2008 at 1:07 PM, Me Me [email protected] wrote:

Thanks a lot in advance
end
k = n
end

Posted via http://www.ruby-forum.com/.

pipe=IO.popen(“executable.exe”)
io=select([io],nil,nil,10) #10 - timeout
if io==nil
puts “DEAD”
t1.raise(“close”)
end

Zhukov P. wrote:

On Mon, Jun 30, 2008 at 1:07 PM, Me Me [email protected] wrote:

Thanks a lot in advance
end
k = n
end

Posted via http://www.ruby-forum.com/.

pipe=IO.popen(“executable.exe”)
io=select([io],nil,nil,10) #10 - timeout
if io==nil
puts “DEAD”
t1.raise(“close”)
end

Hi,
thanks for answering, I tried your code but I get:
test_th.rb:20:in `select’: can’t convert nil into IO (TypeError)

Besides it’s not clear to me what is done by the select.
Do I still need the thread t1 then?
Bye

Hi,

I tried this:

pipe=IO.popen(“hang.exe”)
io=select([pipe],nil,nil,10) #10 - timeout
if io==nil
puts “DEAD”
end

with hang.exe a process that just hangs.
It doesn’t seem that the process is launched at all, and it goes on
without waiting.

Basically I just need to parse an executable output line by line and
trigger an exception if I don’t get any line after a certain amount of
time.

On Mon, Jun 30, 2008 at 1:45 PM, Me Me [email protected] wrote:

Besides it’s not clear to me what is done by the select.
Do I still need the thread t1 then?
Bye

Posted via http://www.ruby-forum.com/.

oh, sorry.: io=select([pipe],nil,nil,10)

no, you does’t, just add code if you want to catch exeption there

Me Me wrote:

Hi,

I tried this:

pipe=IO.popen(“hang.exe”)
io=select([pipe],nil,nil,10) #10 - timeout
if io==nil
puts “DEAD”
end

with hang.exe a process that just hangs.
It doesn’t seem that the process is launched at all, and it goes on
without waiting.

Actually I checked and the process is running but it became a zombie.
It seems that the select doesn’t wait