Front page | perl.poe |
Postings from January 2012
Win32 POE FollowTail strange Behaviour
From:
Alberto De Boni
Date:
January 14, 2012 02:25
Subject:
Win32 POE FollowTail strange Behaviour
Message ID:
4F115816.40700@neobe.it
Hi all,
i've started to use POE for logging event on various sistems. Now,
i'm facing the problem to track a log file, being written by a power
inverter control software, on a Windows machine
The control sofware create the log file as soon as the inverter starts
to perform operations (we're talking about a PV control system).
Considering that i've used the "Filename" watch which documentation
says: Specify the|Filename|to watch. POE::Wheel::FollowTail will wait
for the file to appear if it doesn't exist.
The issue happens as soon as file appears, it seems that the application
goes in an infinite loop calling log_got_line. The only way is to stop
the application.
Am i missing something?
Thanks in advance for any hints.
Alberto De Boni
Here the application.
use warnings;
use strict;
# Include POE and POE::Component::Server::TCP.
use POE qw(Component::Server::TCP);
use POE qw/Wheel::FollowTail/;
use constant port => 10240;
my $currentPower;
my $totalProduction;
my @timeData = localtime(time);
my $year = 1900+$timeData[5];
my $month = 1+$timeData[4];
my $day = $timeData[3];
my $log_file = "C:\\inverter\\".$year."-".$month."-".$day.".log";
print "START LOG OPERATION\n\n";
print "Logging $log_file\n";
# Start a TCP server. Client input will be logged to the console and
# echoed back to the client, one line at a time.
POE::Component::Server::TCP->new(
Alias => "PVMonitor",
Port => port,
ClientInput => sub {
my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0];
print "Session ", $session->ID(), " got input: $input\n";
if ($input eq "DATA"){
my $answer = $currentPower.";".$totalProduction;
$heap->{client}->put($answer);
}
}
);
POE::Session->create
(
inline_states =>{
_start => sub {
$_[HEAP]->{wheel} = POE::Wheel::FollowTail->new(
Filename => $log_file,
InputEvent => 'got_line',
ErrorEvent => 'got_error',
#SeekBack => 2048,
ResetEvent => 'log_reset',
);
$_[HEAP]->{first} = 0;
},
got_line => \&log_got_line,,
got_error => sub { warn "$_[ARG0]\n" },
log_reset => \&got_log_reset,
},
args=> $log_file,
);
sub got_log_reset{
my ($heap, $wheel_id) = @_[HEAP, ARG0];
my $service = $heap->{services}->{$wheel_id};
}
# Start the server.
sub log_got_line{
if ($_[HEAP]->{first}++){
my @splitted = split (';', $_[ARG0]);
#print "$_[ARG0]\n" ;
print "$splitted[0]\n";
$currentPower=$splitted[12];
$totalProduction=$splitted[15];
}
}
$poe_kernel->run();
exit 0;
-
Win32 POE FollowTail strange Behaviour
by Alberto De Boni