That does it ! You ought to be in the "Ruby's Hall of Fame".
Thank you very much for the continuous support ...hopefully someday I will
be able to reciprocate the efforts.
Have a nice one :-D

-- Shanko

P.S> I still do not understand why the redirection on ping does not work
though.

"Park Heesob" <phasis / kornet.net> wrote in message
news:dsY89.77$J5.62 / news.hananet.net...
> Hi,
>
> "Shashank Date" <ADATE / kc.rr.com> wrote in message
> news:XCF89.44011$mj7.808228 / twister.rdc-kc.rr.com...
> >
> > Well, if you change the code back to it's first version where:
> >
> > > > cmds = [
> > > >         "ping 10.0.0.0 -n 30 -w 1000 > NUL",
> > > >         "ping 10.0.0.0 -n 60 -w 1000 > NUL",
> > > >         "ping 10.0.0.0 -n 90 -w 1000 > NUL"
> > > >        ]
> >
> > you will see that the threads are run sequentially and the program ends
> > after (30 + 60 + 90) seconds.
> > This is probably because the f.gets in the "while not f.eof?" loop for
> each
> > thread stalls.
> >
> > See what I mean ?
> Yes, I see.
>
> Here is new version.
> Caution: Do not use redirection like "ping 10.0.0.0 -n 30 -w 1000 > NUL".
>
> #========================================================
> require 'Win32API'
>
> OpenProcess = Win32API.new("kernel32","OpenProcess",['L','L','L'],'L')
> TerminateProcess =
Win32API.new("kernel32","TerminateProcess",['L','L'],'L')
> WaitForSingleObject =
> Win32API.new("kernel32","WaitForSingleObject",['L','L'],'L')
>
>  puts 'Start: ' + `echo %TIME%`
>  cmds = [
>          "ruby -e 'sleep 30'",   # long running processes with no output
>          "ruby -e 'sleep 60'",   # long running processes with no output
>          "ruby -e 'sleep 90'"    # long running processes with no output
>         ]
>
>  out = []
>  threads = []
>
>  for c in cmds
>      threads << Thread.new(c) { |myCmd|
>          puts "#{myCmd}"
>          f = IO.popen(myCmd)
>          hProcess = OpenProcess.Call(0x100001, 1 ,f.pid)
>          Thread.current['pid'] = hProcess
>          while true
>            a = WaitForSingleObject.Call( hProcess, 0);
>            break if a==0
>          end
>      }
>  end
>
>  puts threads.length.to_s + ' threads running'
>
>  begin
>      i = 0
>      threads.each { |t| i += 1 if t.stop? }
>      puts `echo %TIME%`
>      b = File.exists?("C:junkj0.txt")
>      puts i.to_s + ':' + File.mtime("C:junkj0.txt").to_s if $DEBUG and b
>      $stdout.flush
>  end until (i == threads.length) || (not b)
>  puts 'Mid: ' + `echo %TIME%`
>  threads.each { |t|
>     TerminateProcess.Call(t['pid'],0) if t.alive?
>  }
>
>  puts 'Stop: ' + `echo %TIME%`
>  puts out if $DEBUG
> #===========================================
>
> Park Heesob.
>
>