Portál AbcLinuxu, 10. května 2025 01:29
Zdravím všechny.
Mám tady další, pro mě dosti oříšek.
Potřebuji v programu vykonat určitou akci vždy v daný čas. Potíž je, že se akce má opakovat každou celou hodinu.
Nyní mám použito nešťastné řešení, navázané na jinou akci, něco takového:
my %dttime = ();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$dttime{year } = sprintf "%04d",($year + 1900);
$dttime{mon } = sprintf "%02d",($mon + 1);
$dttime{mday } = sprintf "%02d",$mday;
$dttime{wday } = sprintf "%02d",$wday + 1;
$dttime{yday } = sprintf "%02d",$yday;
$dttime{hour } = sprintf "%02d",$hour;
$dttime{min } = sprintf "%02d",$min;
$dttime{sec } = sprintf "%02d",$sec;
$dttime{isdst} = $isdst;
if ($dttime{min} eq '00') {
print ":367: Je přesně $dttime{hour}:$dttime{min} hodin");
}
To celé je v sub on_public , tedy v reakcích na něco jiného a jestliže není zrovna po dobu trvání minuty 00 žádná akce požadována, výpis neproběhne.
Nyní co potřebuji...
Potřebuji, aby mi aplikace každou minutu kontrolovala aktuální čas a v celou hodinu vypsala přesný čas. Návaznost na akce v předchozím není nutná, snad ani žádoucí . Pokud by přesto musel výpis času zůstat navázán na jiné akce, je třeba ošetřit, aby se vypsal pouze jednou v každou celou hodinu, nyní se vypisuje u každé akce vždy po dobu trvání 00 minut .-) Moc díky všem
Řešení dotazu:
Viz níže, nejde mi o spuštění aplikace, ale o vykonání příkazu v 00. :o)
@list = ( [ time + 900, \&o_15_minut ], [ time + 3600, \&o_hodinu ], );ak používaš nejakú slučku s prerušením (napr
poll
), tak použi verziu s timeoutom (ten zabezpečí pravidelné prerušenie) a potom spusti všetky záznamy zo zoznamu, ktorý čas spustenia je menší alebo rovný ako aktuálny čas. Timeout použiť dynamický, rozdiel medzi aktuálnym časom a minimom zo zoznamu.
ak nie, tak skús alarm
pre výpočet času nasledujúcej udalosti skús Schedule::Cron::Events
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.