URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9122
[ Назад ]

Исходное сообщение
"Несколько 'таймеров'"

Отправлено localhorst , 10-Май-11 17:56 
Суть: нужно создать несколько (в идеале до бесконечности) "таймеров".
То есть я хочу, чтобы в рамках одного процесса разные функции вызывались с различными интервалами.
К примеру:
sub f1 {
print STDOUT "Func1\n";
}
sub f2 {
print STDOUT "Func2\n";
}
Чтобы, скажем, f1 вызывалась раз в 4 секунды, а f2 раз в 9 секунд.

Читал про Time::HiRes и setitimer в нем, но, кажется, оно меня не спасет.
Подскажите, плз.


Содержание

Сообщения в этом обсуждении
"Несколько 'таймеров'"
Отправлено ACCA , 11-Май-11 03:32 
>[оверквотинг удален]

"Несколько 'таймеров'"
Отправлено ACCA , 11-Май-11 17:23 
Сделай что-нибудь в духе Discrete Event Simulation:

my $time = 0;
sub func1{ print "func1: $time\n"; }
sub func2{ print "func2: $time\n"; }

my %sch = (
    ev1 => { INT => 4, C => 4, DO => \&func1 },
    ev2 => { INT => 9, C => 9, DO => \&func2 }
);

while (1) {
    my $ntime = LONG_MAX;
    foreach my $k (keys %sch) {
        $ntime = $sch{$k}{C} if ($ntime> $sch{$k}{C});
    }
    sleep($ntime-$time);
    $time = $ntime;
    foreach my $k (keys %sch) {
        if ($sch{$k}{C} <= $time) {
            $sch{$k}{C} += $sch{$k}{INT};
            &{$sch{$k}{DO}};
        }
    }
}