2011-07-28 6 views
5

どのようにタイマーを「可視」にすることができますか?この例は(sleep-timeからのintendendent)2(私は睡眠時間と同様の何かを期待しています)を返します。AnyEventタイマーに関する質問

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

答えて

6

少なくとも二つの問題があります。

  • sleep 5がイベントループを実行しませんが。
  • コールバックによってcondがトリガーされます。変数。たとえば、sleep 5ステートメントを削除した場合は、$cは1だけになります。

これはあなたの欲しいものですか?

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

なぜスリープで1の代わりに2が得られるのかまだわかりませんでした。 –

+0

"after => 0"コールバックが1つ、最初のコールバックが1つ取得されています。 "after"を指定せずにタイマーを作成し、$ cが1であるかどうか確認してください。 – ErikR

3

sleepが「アクティブ」である一方、イベントループは(も何も実行されていない)が実行されていません。したがって、AnyEventで登録されたイベントはトリガーできません。

ルールAnyEvent(または他の非同期フレームワーク)を使用する場合は、sleepを使用しないでください。

正しい解決策については、user5402の回答を参照してください。