--------------070608000501030602000600
Content-Type: text/plain; charset=GB2312
Content-Transfer-Encoding: 7bit

Hi:

I want to execute external routines in my ruby program in a
multithreading way and capture the error information occured in external
routines into a log file. But when i executed external routines in this way:
error_msg  *`...execute cmd...`*/
All threads in my program didn't seem to run in synchronous way, when i
used /*system("*//*...execute cmd...*//*"),*/ all threads did run
synchronously but i can't get the error information except using this
method: /*system("*//*...execute cmd...*//* > log_file") */and then get
the information from the log_file.


i made a curt routines to recur this problem:

---------------------------
test.rb:

threads  ]
5.times do |num|
threads << Thread.new do
system("ruby a.rb thread#{num+1}")
#`ruby a.rb thread#{num+1}`
system("ruby b.rb thread#{num+1}")
#`ruby b.rb thread#{num+1}`
system("ruby c.rb thread#{num+1}")
#`ruby c.rb thread#{num+1}`
system("ruby d.rb thread#{num+1}")
#`ruby d.rb thread#{num+1}`
end
sleep(1)
end
threads.each {|t| t.join}
----------------------------

----------------------------
a.rb:

sleep(5)
time_now  ime.now.strftime("%H:%M:%S")
raise "#{time_now} AAAAA Exception #{ARGV}"

-----------------------------
-----------------------------
b.rb:

sleep(5)
time_now  ime.now.strftime("%H:%M:%S")
raise "#{time_now} BBBBB Exception #{ARGV}"

-----------------------------
-----------------------------
c.rb:

sleep(5)
time_now  ime.now.strftime("%H:%M:%S")
raise "#{time_now} CCCCC Exception #{ARGV}"

-----------------------------
-----------------------------
d.rb:

sleep(5)
time_now  ime.now.strftime("%H:%M:%S")
raise "#{time_now} DDDDD Exception #{ARGV}"

-----------------------------


when use */system /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:12:58 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:12:59 AAAAA Exception thread2 (RuntimeError)
a.rb:3: 00:13:00 AAAAA Exception thread3 (RuntimeError)
a.rb:3: 00:13:01 AAAAA Exception thread4 (RuntimeError)
a.rb:3: 00:13:02 AAAAA Exception thread5 (RuntimeError)
b.rb:3: 00:13:03 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:13:04 BBBBB Exception thread2 (RuntimeError)
b.rb:3: 00:13:05 BBBBB Exception thread3 (RuntimeError)
b.rb:3: 00:13:06 BBBBB Exception thread4 (RuntimeError)
b.rb:3: 00:13:07 BBBBB Exception thread5 (RuntimeError)
c.rb:3: 00:13:08 CCCCC Exception thread1 (RuntimeError)
c.rb:3: 00:13:09 CCCCC Exception thread2 (RuntimeError)
c.rb:3: 00:13:10 CCCCC Exception thread3 (RuntimeError)
c.rb:3: 00:13:11 CCCCC Exception thread4 (RuntimeError)
c.rb:3: 00:13:12 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:13:13 DDDDD Exception thread1 (RuntimeError)
d.rb:3: 00:13:14 DDDDD Exception thread2 (RuntimeError)
d.rb:3: 00:13:15 DDDDD Exception thread3 (RuntimeError)
d.rb:3: 00:13:16 DDDDD Exception thread4 (RuntimeError)
d.rb:3: 00:13:18 DDDDD Exception thread5 (RuntimeError)

but when use */`cmd` /*the output as follow:

D:\Mywork\Ruby\project>ruby test.rb
a.rb:3: 00:16:17 AAAAA Exception thread1 (RuntimeError)
a.rb:3: 00:16:22 AAAAA Exception thread2 (RuntimeError)
b.rb:3: 00:16:22 BBBBB Exception thread1 (RuntimeError)
b.rb:3: 00:16:28 BBBBB Exception thread2 (RuntimeError)
a.rb:3: 00:16:28 AAAAA Exception thread3 (RuntimeError)
c.rb:3: 00:16:28 CCCCC Exception thread1 (RuntimeError)
b.rb:3: 00:16:33 BBBBB Exception thread3 (RuntimeError)
d.rb:3: 00:16:33 DDDDD Exception thread1 (RuntimeError)
c.rb:3: 00:16:33 CCCCC Exception thread2 (RuntimeError)
a.rb:3: 00:16:33 AAAAA Exception thread4 (RuntimeError)
c.rb:3: 00:16:38 CCCCC Exception thread3 (RuntimeError)
d.rb:3: 00:16:38 DDDDD Exception thread2 (RuntimeError)
b.rb:3: 00:16:38 BBBBB Exception thread4 (RuntimeError)
d.rb:3: 00:16:44 DDDDD Exception thread3 (RuntimeError)
a.rb:3: 00:16:44 AAAAA Exception thread5 (RuntimeError)
c.rb:3: 00:16:44 CCCCC Exception thread4 (RuntimeError)
b.rb:3: 00:16:49 BBBBB Exception thread5 (RuntimeError)
d.rb:3: 00:16:49 DDDDD Exception thread4 (RuntimeError)
c.rb:3: 00:16:54 CCCCC Exception thread5 (RuntimeError)
d.rb:3: 00:16:59 DDDDD Exception thread5 (RuntimeError)

The expected output is the first one(use */system/*), but i don't know
why the output is different between the two ways. Could you someone can
tell me why? :-)
Thank you very much!


regards






--------------070608000501030602000600--