From: Shea Martin Date: 2005-10-14T01:16:54+09:00 Subject: Re: threading in win32 Ara.T.Howard wrote: > 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 > This works, but my problem is I was using 'copy' as an example, b/c I was pretty sure you would have that command. The actual command is xbcp which is xbox copy. It comes with Microsoft's Xbox development software, and is to copy files to a microsft xbox debug machine. I don't know what the protocol used is, so I am kind of locked into the command. I suspect, that it is ftp or samba, but I am getting OT. Your point a good one, and I guess someday when I have more time, I will look into implementing xbcp in ruby. (Should be easy if protocol is indeed FTP). Thanks for your help, it is much appreciated. ~S