Did you see this?
http://stackoverflow.com/questions/958662/shoes-and-heavy-operation-in-separate-thread

It uses an .append method, maybe that has built in smarts to allow the GUI
to update
Tried to have a look but th docs are as funky as _why's manual ;)

BTW, having a rescue that just re-raises is redundant


On Tue, Jan 15, 2013 at 9:26 PM, Steve L. <[email protected]> wrote:

> TL;DR: How do you pass execution from within a PTY.spawn block back to
> the calling thread long enough to allow the caller to update GUI
> elements?
>
>
> I have a situation that I doubt is particularly unique, but Google
> hasn't been a lot of help, so I thought I'd try you guys as a last
> resort.  So...to jump right in to it:
>
> I've built a front-end GUI for running Cucumber tests using Shoes. All
> the app really does is take user selections from the GUI and use them to
> string together a command line that I'm then passing in to it's own
> process through a PTY.spawn call.
>
> The point of using the PTY library was to be able to grab the STDOUT
> stream of the child process in real time, as per this stack-overflow:
>
> http://stackoverflow.com/questions/1154846/continuously-read-from-stdout-of-external-process-in-ruby
>
> When testing the bare-bones of my code in a terminal, it works
> beautifully...the external process is spawned, and I'm able to pull the
> stdout of the external process and see it in real time.  However, my
> situation has the added layer of a GUI.  Despite the fact that I'm sure
> that the IO pipes are flowing properly, I'm still not getting an update
> on my GUI until after the child process terminates.
>
> I've done enough reading to understand that this has something to do
> with the way Ruby handles thread priority, but I'm having a little bit
> of trouble groking a potential solution to my problem.  In short, what
> I'm looking for is a way to 'give back' execution to my GUI process long
> enough to let it update itself from the STDOUT output of the child
> process.
>
> I hope I was clear enough, but feel free to ask clarifying questions,
> and I appreciate any insight!
>
> My code, for reference:
>
> def spawn_command_in_pty(cmd, env, outwindow)
>       env.each do |k, v|
>         ENV[k] = v
>       end
>       PTY.spawn(cmd) do |r, w, pid|
>         begin
>           r.each{|line| outwindow.text = outwindow.text + line }
>         rescue Errno::EIO => e
>           raise e
>         end
>       end
>
>     end
>
> Steve
>
> --
> Posted via http://www.ruby-forum.com/.
>
>

-- 
[email protected] | 
https://groups.google.com/d/forum/ruby-talk-google?hl=en


Reply via email to