From: Shea Martin Date: 2005-10-13T23:12:04+09:00 Subject: Re: threading in win32 Ara.T.Howard wrote: > On Thu, 13 Oct 2005, Shea Martin wrote: > >> I have a TK app. On a button presses, I call a windows copy command >> which can take up to 10 minutes to run. In order to not freeze the >> GUI, so that the gui can be doing other stuff, I launch the command in >> a thread. >> >> Running the command with system, does not let me get the output of the >> command, thought it does not lock gui up at all. So, I tried two >> other versions. I had the most success with version 3. I believe >> version 3 is what the TkTextIo example uses in ruby 1.8.3. See below. >> >> # callback for tk button press >> def buttonPress >> Thread.new do >> Button.state( "disable" ); >> runCommand( "copy /Y bigfile1 dest1" ); >> runCommand( "copy /Y bigfile2 dest2" ); >> runCommand( "copy /Y bigfile3 dest3" ); >> Button.state( "active" ); >> end >> end >> >> #version 1 >> def runCommand( cmd ) >> system( cmd ) >> end >> >> #version 2 >> def runCommand( cmd ) >> IO.popen( cmd ) do | cmd_out | >> cmd_out.each_line do | line | >> MyTextArea.insert( 'end', line, 'normal' ) >> end >> end >> end >> >> #version 3 >> def runCommand( cmd ) >> cmd_pipe = IO.popen( cmd ) >> t = Thread.new { cmd_pipe.each{ | line | addText( line ) } } >> t.join >> end >> >> 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"? ~S