Un vigilante de tipo idle detecta cuando el sistema esta ocioso, esto es: cuando
no hay eventos pendientes. Permite dos atributos adicionales min => $seconds
y max => $seconds.
max segundos
Event esta ocioso
los eventos no serán generados con mayor frecuencia que min segundos
min ni max el vigilante
adopta la conducta de una-vez por defecto (si repeat es falso).
Si repeat es verdadero la conducta por defecto es repetir.
repeat a 1 cambiamos dicha conducta. en tal caso: min = 0.01 y
max toma el valor infinito.
pp2@nereida:~/src/perl/Event$ cat -n idlewatcher.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use IO::File;
6 use Math::BigFloat qw(:constant);
7 use constant VALUE => 0.001;
8 use Event qw{loop unloop};
9
10 STDIN->blocking(0);
11 STDERR->autoflush(1);
12 print "Press CTRL_D to finish, any other key to monitor the computation\n";
13
14 my $idle = Event->idle(
15 data => VALUE,
16 cb => sub {
17 $_[0]->w->data($_[0]->w->data+VALUE);
18 },
19 repeat => 1
20 );
21
22 my $io = Event->io(
23 fd => \*STDIN,
24 cb => sub {
25 warn "Partial result: ", $idle->data,".\n";
26 my $bytes = sysread(STDIN, $_, 4);
27 unloop if (defined($bytes) and ($bytes == 0));
28 }
29 );
30 loop;
Event
proporciona un atributo especial para los objetos watcher
con nombre data . Puede ser utilizado por
el programador para guardar información en el objeto watcher.
El único argumento que se pasa al manejador o callback es el objeto evento que ha de ser manejado.
El método w de dicho objeto permite obtener el vigilante.
Cuando se ejecuta el programa anterior se obtiene una salida similar a esta:
pp2@nereida:~/src/perl/Event$ idlewatcher.pl
Press CTRL_D to finish, any other key to monitor the computation
<-- retorno de carro
Resultado parcial: 0.179.
<-- retorno de carro
Resultado parcial: 0.249.
<-- retorno de carro
Resultado parcial: 0.346.
<-- retorno de carro
Resultado parcial: 0.447.
<-- retorno de carro
Resultado parcial: 0.54.
^D <-- El usuario pulsa CTRL-D en un sistema Unix para terminar
min = 0 en el ejemplo anterior. ¿Que observa?Casiano Rodríguez León
