From: "Ara.T.Howard" Date: 2005-10-14T00:11:54+09:00 Subject: Re: threading in win32 On Thu, 13 Oct 2005, Shea Martin wrote: >>> Only version 1 allows teh gui to remain responsive. Unfortunately it does >>> not capture the output of the copy command. I would like to something >>> with a fork, though win32 ruby does not seem to support it. >>> >>> Any ideas. >> >> >> i think reading from pipes should not block the whole process in windows, >> at >> least this works fine on my win system: >> >> Thread::abort_on_exception = true >> t = Thread::new{ IO::popen("tree c:").read } >> (4 << 2).times{ p 42; sleep 0.42 } >> puts t.value >> >> does it work on yours? >> >> perhaps you need something like >> >> #version 4 >> def runCommand( cmd ) >> Thread::new do >> IO::popen("#{ cmd 2>&1 }"){|pipe| pipe.each{|line| addText line}} >> end >> end >> >> which is to say spawn the thread and let it go. you'll need to prevent two >> commands being run at once too... >> >> hth. >> >> -a > > > Everything works for fine when cmd = "tree C:\ /F". The text area is > updating, with gobs of output, and I can still use the scroll bars, etc. > But when cmd = "copy /Y 1GB_FILE.BIG BAK_1GB_FILE.BIG", the problem occurrs. > Scrollbars don't work, etc. I guess this must be a windows limitation. This > is a 3.2 GHz machine with H/T enabled, and 2GB of RAM, so I don't think it is > a h/w limitation (though it is only IDE). Also, if I use the system( cmd ), > version it does not happen, and it does not happen if I just copy the file > (manually) while running the gui. I'll have to try it when I get home > tonight on my solaris and linux boxen. > > What happens when you try cmd = "copy /Y 1GB_FILE.BIG BAK_1GB_FILE.BIG"? it hangs. but this is no fault of ruby - it is some crappy detail of copy and/or the way windows interacts with it. for instance, this program manages to copy huge files just fine while background threads/processes continue to run, new ones can be started, and the gui works all the while: require "tk" require "fileutils" gb = 2 ** 30 mb = 2 ** 20 kb = 2 ** 10 unless test ?e, 'gb' puts "writing file 'gb'. be patient..." buf = "\0" * mb open('gb', 'w'){|f| kb.times{ f.write buf }} puts "wrote 'gb'" end FileUtils::rm_rf 'gb2' Thread::abort_on_exception = true thread_runner = lambda do Thread::new do program = <<-ruby STDERR.reopen STDOUT STDOUT.sync = true loop{ p [Process::pid, Time::now]; sleep 0.42 } ruby pipe = IO::popen "ruby", "rb+" pipe.write program pipe.close_write pipe.each do |line| puts line end end end thread_runner2 = lambda do Thread::new do loop do if test ?e, 'gb2' size = File::stat('gb2').size p 'gb2' => size break if size == gb end sleep 0.42 end end Thread::new do FileUtils::cp 'gb', 'gb2' end end TkButton::new(nil, "text" => "start thread/process", "command" => thread_runner).pack( "fill" =>"x") TkButton::new(nil, "text" => "huge copy", "command" => thread_runner2).pack( "fill" =>"x") TkButton::new(nil, "text" => "say hello", "command" => lambda{puts "HELLO"}).pack( "fill" =>"x") TkButton::new(nil, "text" => 'quit', "command" => lambda{exit}).pack("fill" => "x") Tk::mainloop hth. -a -- =============================================================================== | email :: ara [dot] t [dot] howard [at] noaa [dot] gov | phone :: 303.497.6469 | Your life dwells amoung the causes of death | Like a lamp standing in a strong breeze. --Nagarjuna ===============================================================================