Re: POE::Loop::Glib/Gtk2 trips over Wheel output
[email protected] (Rocco Caputo) Tue, 9 Mar 2010 12:09:28 -0500
| Newsgroups | perl.poe |
|---|---|
| Message-ID | <[email protected]> |
On Mar 9, 2010, at 11:59, Mike Schilli wrote: > On Tue, 9 Mar 2010, Rocco Caputo wrote: > >> I believe you may have encountered a known bug with a simple >> solution. https://rt.cpan.org/Public/Bug/Display.html?id=53302 >> Now if only we could somehow get that patch released.... > > Is the solution to be applied to POE itself or POE::Loop::Glib? > Anything > I can do from 'userland'? If it's the right solution, it's to be applied to POE::Loop::Glib. There's not much to be done from userland, except maybe to ask the author to apply and release the change. Maybe the author would like a co-maintainer? -- Rocco Caputo - [email protected] >> On Mar 9, 2010, at 03:10, [email protected] wrote: >> >>> I'm trying to combine POE with a Gtk2 event loop, but it seems >>> that this >>> trips up POE, which then stops processing a wheel's output. >>> Below is a simplified example, which starts a Gtk2 loop and a Run >>> Wheel >>> which counts to 10000, but POE stops processing its output after >>> 420 and >>> then hangs (freezes GUI). >>> Funny thing is, you can even throw out the Gtk GUI parts, and it >>> still >>> fails, as long as the "use Gtk2 '-init'" line is there. As soon as >>> that's gone, POE processes everything correctly. >>> Would be great if someone could comment on if I'm doing something >>> weird. >>> -- Mike >>> Mike Schilli >>> [email protected] >>> #!/usr/local/bin/perl -w >>> use strict; >>> use Gtk2 '-init'; >>> use POE::Kernel { loop => "Glib" }; >>> use POE::Session; >>> use POE::Wheel::Run; >>> use POE::Filter::Stream; >>> POE::Session->create( >>> inline_states => { >>> _start => \&ui_start, >>> play => \&play, >>> out => \&stdout_handler, >>> }); >>> $poe_kernel->run(); >>> exit 0; >>> ########################################### >>> sub ui_start { >>> ########################################### >>> my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; >>> $heap->{main_window} = Gtk2::Window->new ('toplevel'); >>> $kernel->yield('play'); >>> } >>> ########################################### >>> sub play { >>> ########################################### >>> my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; >>> my $wheel = >>> POE::Wheel::Run->new( >>> Program => sub { print "$_\n" for 1..10000; }, >>> StdoutFilter => POE::Filter::Stream->new(), >>> StderrEvent => 'out', >>> StdoutEvent => 'out', >>> ); >>> $heap->{player} = $wheel; >>> } >>> ########################################### >>> sub stdout_handler { >>> ########################################### >>> my ($heap, $input, $wheel_id) = @_[HEAP, ARG0, ARG1]; >>> print STDERR "$input\n"; >>> } >>