Search code examples
perltimerevent-handlinganyevent

AnyEvent timer question


How could I make "visible" the timer? This example returns (intependent from the sleep-time always) 2 (I expected something similar to the sleep-time).

#!/usr/local/bin/perl
use warnings;
use 5.014;
use AnyEvent;

my $c = 0;
my $cv = AnyEvent->condvar;

my $once_per_second = AnyEvent->timer (
    after => 0,
    interval => 1,
    cb => sub {
        $c++;
        $cv->send;
    },
);

sleep 5;

$cv->recv;

say $c;

Solution

  • There are at least two problems:

    • sleep 5 doesn't run the event loop.
    • Your callback triggers the cond. variable. If, for instance, you removed the sleep 5 statement, $c would only be 1.

    Is this what you want?

    my $c = 0;
    my $cv = AnyEvent->condvar;
    my $once_per_second = AnyEvent->timer(after => 0, interval => 1, cb => sub { $c++ });
    my $five_seconds = AnyEvent->timer(after => 5, cb => sub { $cv->send });
    $cv->recv;
    say $c;