在这个程序中 POE::Wheel::FollowTail 可以很好地跟踪文件的尾部,它也在一个单独的线程中运行以简单地监视编译作业的进度。
在 InputEvent 处理程序中有一个粗略的正则表达式来提取编译结果,并且一切正常,但我无法在此子之外访问任何结果值。即使我将结果变量放在全局范围内,它们也不会被修改。
该程序由一个运行编译作业的进程、另一个查看日志和主循环等待组成。
全球范围:
my $Pass = 0;
my $Done = 0;
然后开始监控:
threads->create(\&StartWatcher);
监视日志文件 sub 如下所示:
sub StartWatcher
{
my $logfile = "filename.log";
# Create the logfile watcher
POE::Session->create
(
inline_states =>
{
_start => sub
{
$_[HEAP]{tailor} = POE::Wheel::FollowTail->new( Filename => $logfile, InputEvent => "got_log_line", );
},
got_log_line => sub
{
$Pass += () = $_[ARG0] =~ /^\d+.*vcproj \- 0 error\(s\), \d+ warning\(s\)/g;
$Done += () = $_[ARG0] =~ /^\d+.*vcproj \- \d+ error\(s\), \d+ warning\(s\)/g;
print "POE InputEvent Pass: $Pass, Done: $Done\n"; # Debug output
},
}
);
POE::Kernel->run();
}
$logfile 是由使用 Win32::Process::Create 启动的 Visual Studio 编译作业编写的,主要的 Perl 执行位于此循环中,等待编译器终止,并每秒产生一个状态输出。
while('true')
{
$ProcessObj->Wait(100); # milliseconds wait
$ProcessObj->GetExitCode($exitcode);
if ( $exitcode == STILL_ACTIVE )
{
"Compiling... [$Done/$Count] Pass: $Pass Failed: $failed"
if($RunCounter++ % 10 == 0);
next;
}
last;
}
产生的输出类似于:
POE InputEvent Pass: 1, Done: 1
Compiling... [0/91] Pass: 0 Failed: 0
IE。在 InputEvent 处理程序 got_log_line 中,两个全局变量已递增,但在 Perl 主循环中,它们仍为零。我意识到我可以从 InputEvent 处理程序进行打印输出,但它为什么不修改全局变量?
出了什么问题?