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 ?