AnyEventはじめました(2)
beginとend
beingとendはセットで使います。beginで呼び出された回数分だけ、endを実行するとイベントループを抜けたい処理を書く場合はこれを使います。
AnyEventの内部にカウンタがセットされていて、それを++するのがbegin(),--するのがendだと思えば良いと思います。
ちなみに$cv->sendを実行すれば、$cv->beginを何回実行していてもすぐに終了します。
サンプルコード
package main; use strict; use warnings; use AnyEvent::Impl::Perl; use AnyEvent; my $interval = 3; my $cv = AnyEvent->condvar; my $w1; $w1 = AnyEvent->idle( cb => sub { print "オラ"; } ); my $w2; $w2 = AnyEvent->timer( after => 3, interval => $interval, cb => sub { $cv->end(); } ); my $w3; $w3 = AnyEvent->signal( signal => 'INT', cb => sub { print "\n\n$interval 秒、追加ッ!!\n\n"; $cv->begin(); }, ); print "僕のッ\n"; print "気が済むまでッ\n"; print "殴るのをやめないッ\n"; sleep(1); $cv->begin(); $cv->recv;
Ctrl+cを押してシグナルを送信すると$cv->beginが実行されます。
その結果、$cv->endを余計に実行しないとイベントループを抜けないようになりました。
イベントループを抜けるタイミングをコントロールしたい場合に使えるかもしれません。