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