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 ?