也就是让事件循环处理当前队列中的事件。在 VBA 中,调用名为DoEvents
.
我想在 Perl 中做到这一点。最好在 AnyEvent 中执行此操作,因为我有一个用它编写的脚本。但我在文档中找不到任何类似的功能。
我天真地尝试用 condvar 实现它,因为文档说recv
调用事件循环,但它失败了,这里是示例代码:
use strict;
use warnings;
use AnyEvent;
use AnyEvent::Strict;
sub _long_task;
my $t1 = AE::timer 0, 3, sub{print"task 1, with interval 3 seconds\n";};
my $t2 = AE::timer 0, 7, sub{print"task 2, with interval 7 seconds\n";};
my $t3 = AE::timer 0, 11, sub{print"task 3, with interval 11 seconds\n";};
my $t_long = AE::timer 0, 0, \&_long_task;
sub DoEvents()
{
my $cv = AE::cv;
my $t = AE::timer 0, 0, sub { $cv->send; };
$cv->recv;
}
sub _long_task {
print"long task: ENTERING\n";
for(1..5) {
print"long task: doing some work for 2 seconds\n";
sleep 2;
print"long task: calling DoEvents\n";
DoEvents();
}
print"long task: EXITING, resheduling after 10 seconds\n";
$t_long = AE::timer 10, 0, \&_long_task;
}
AE::cv->recv;
输出是:
task 1, with interval 3 seconds
task 2, with interval 7 seconds
task 3, with interval 11 seconds
long task: ENTERING
long task: doing some work for 2 seconds
long task: calling DoEvents
AnyEvent::CondVar: recursive blocking wait attempted at C:\Users\andreyi\Desktop\try_event_loop.pl line 18.
更新: AnyEvent.pm 中有几行:
$WAITING
and Carp::croak "AnyEvent::CondVar: recursive blocking wait attempted";
如果您对它们发表评论,则 DoEvents() 有效。
但是,最好有不涉及修改此 CPAN 模块的解决方案。