I was writing some code where I wanted to detect if the system was 
"idle" by having a yield event going round and round and seeing if 
anything happens inbetween. This works reasobably well, except when
POE uses Tk. To demonstrate:

#!/usr/bin/perl -wl
use strict;
# use Tk;
use POE;

pipe(local *RD, local *WR) || die "Pipe: $!";
close WR;

# Next few lines are unneeded. Just to make it absolutely clear
# RD is readable
vec(my $r, fileno(RD), 1) = 1;
select($r, undef, undef, undef) == 1 || die "Too weird";

my $hit = 0;
POE::Session->create
    (inline_states => {
        _start  => sub {
            $poe_kernel->select_read(\*RD, "readable");
            $poe_kernel->yield("yielder");
        },
        "yielder" => sub {
            print STDERR "yielder";
            if (++$hit < 10) {
                $poe_kernel->yield("yielder");
            } else {
                $poe_kernel->select_read(\*RD);
            }
        },
        readable        => sub {
            print STDERR "readable";
        },
    });

$poe_main_window->geometry("+10+10") if $poe_main_window;
$poe_kernel->run();

This outputs as expected:
yielder
readable
yielder
readable
yielder
readable
yielder

However, if I comment in the use Tk line, I get an extra yielder at the 
start:

yielder
yielder
readable
yielder
readable
yielder

Was I depending too much on internal details in expecting a pure 
switching between readable and yielder ?

Reply via email to