S
Shea Martin
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.
Thanks,
~S
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.
Thanks,
~S