< :the previous in number
^ :the list in numerical order
> :the next in number
P :the previous (in thread)
N :the next (in thread)
|<:the top of this thread
>|:the next thread
^ :the parent (reply-to)
_:the child (an article replying to this)
>:the elder article having the same parent
<:the youger article having the same parent
---:split window and show thread lists
| :split window (vertically) and show thread lists
~ :close the thread frame
.:the index
..:the index of indices
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.