2011-07-28 21 views
5

¿Cómo podría hacer "visible" el temporizador? Este ejemplo regresa (dependiente del horario de reposo siempre) 2 (esperaba algo similar a la hora de reposo).AnyEvent pregunta del temporizador

#!/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; 

Respuesta

6

Hay al menos dos problemas:

  • sleep 5 no se ejecuta el bucle de eventos.
  • Su devolución de llamada activa el cond. variable. Si, por ejemplo, eliminó la declaración sleep 5, $c sería solo 1.

¿Esto es lo que quiere?

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; 
+0

Todavía no entiendo por qué con 'sleep' obtengo 2 en lugar de 1. –

+0

Recibirá una devolución de llamada para" after => 0 "y luego una devolución de llamada para el primer intervalo. Intente crear el temporizador sin especificar el "después" y vea si $ c es 1. – ErikR

3

bucle El evento no se está ejecutando (así no se está ejecutando), mientras que sleep es "activo". Por lo tanto, no se puede desencadenar ningún evento registrado en AnyEvent.

La regla: si utiliza AnyEvent (o cualquier otro marco ansynchronous), nunca utilice sleep.

Consulte la respuesta del usuario5402 para la solución correcta.