2011-07-28 4 views
5

Comment est-ce que je pourrais rendre "visible" la minuterie? Cet exemple renvoie (indépendamment de l'heure de sommeil toujours) 2 (je m'attendais à quelque chose de semblable au temps de sommeil).AnyEvent timer question

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

Répondre

6

Il y a au moins deux problèmes:

  • sleep 5 ne fonctionne pas la boucle d'événements.
  • Votre rappel déclenche la cond. variable. Si, par exemple, vous avez supprimé l'instruction sleep 5, $c ne serait plus que 1.

Est-ce ce que vous voulez?

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

Je ne comprenais pas encore pourquoi avec 'sleep' j'obtiens 2 au lieu de 1. –

+0

Vous obtenez un callback pour le" after => 0 "puis un rappel pour le premier intervalle. Essayez de créer la minuterie sans spécifier "après" et voir si $ c est 1. – ErikR

3

La boucle d'événements ne fonctionne pas (bien rien ne fonctionne) tandis que sleep est « actif ». Aucun événement enregistré avec AnyEvent ne peut donc être déclenché.

La règle: Si vous utilisez AnyEvent (ou tout autre cadre ansynchronous), ne jamais utiliser sleep.

Voir la réponse de l'utilisateur5402 pour la bonne solution.