5

タイマーを「見える」ようにするにはどうすればよいですか? この例は (常にスリープ時間とは無関係) を返します (スリープ時間2に似たものを期待していました)。

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

2 に答える 2

6

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

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

これは、あなたの望むことですか?

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;
于 2011-07-28T07:18:03.697 に答える
3

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

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

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

于 2012-09-04T16:01:50.350 に答える