Re: POE::Loop::Glib/Gtk2 trips over Wheel output

[email protected] (Rocco Caputo) Tue, 9 Mar 2010 11:45:20 -0500
Newsgroups perl.poe
Message-ID <[email protected]>
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....

-- 
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";
> }