Avatar billede Syska Mester
17. februar 2005 - 14:14 Der er 12 kommentarer og
2 løsninger

Timer der kører præcis hver 10 minut

Hej,

Hvordan laver jeg en timer der kører præcis på klokken slettet:
xx:00/15/30/45
altså
14:00
14:15
14:30
14:45
og udfører en process, jeg kan ikke regne med at det tager lige lang tid hver gang, og hvis jeg bare siger at en timer skal trigge om 15 min. vil det vel blive senere og senere, jo længere tid programmet har kørt?
Hvordan griber man det an? eller kan man trigge på et klokkenslet med wildcards i....

// ouT
Avatar billede arne_v Ekspert
17. februar 2005 - 14:18 #1
Hvis du definerer en timer til at køre første gang kl. 14 og derefter med
15*60*1000 millisekunders mellemrum, så vil jeg da forvente at det
starter til tiden uanset hvor lang tid det tager at køre timeren.
Avatar billede jpvj Nybegynder
17. februar 2005 - 14:19 #2
Du laver en timer event.

Ved programmets start, læser du klokken og "udregner" hvor mange millisekunder der til næste xx:yy:00 (hvor yy er 00/15/30). Dette tal sætter du så på timeren og enabler den.

Når timer event sker, udfører du følgende:

- slå timeren fra (altid pænt)
- kør din process.
- Når denne er færdig gentages udregningen og timeren startes.

Hvis din process hænger vil programmet således ikke forsøge at starte den igen og igen.

Hvis din process tager længere end 15 min (ex. 16 min), vil den ikke køre "2. gang" (eller 3. eller 4. ...).
Avatar billede the_party_dog Nybegynder
17. februar 2005 - 14:20 #3
ville tage en timer som kørte hvert sek, og lave en case som tjekkede datetime.now.minute == 15 osv
Avatar billede ibleif Nybegynder
17. februar 2005 - 14:25 #4
the party dog: Du kunne også lave en "while(true)" :-)

// Ibleif
Avatar billede Syska Mester
17. februar 2005 - 14:25 #5
arne -> kan man regne med det? ikke 10000% vigtigt at det bliver lige der, men ville helt have det.

jpvj -> lyder som den rigtige ide.

the_party_dog -> Lige præcis også min ide, men synes det er over kill at køre sådan en hver sekund.

Andre der har ideer?
Avatar billede arne_v Ekspert
17. februar 2005 - 14:36 #6
Det er jeg ret sikker på. Men test det !
Avatar billede burningice Nybegynder
17. februar 2005 - 14:52 #7
the_party_dog>> i dit tilfælde ville timeren udfører koden 59 gange for tit ;)

hvis du er sikker på at din kode ikke tager mere end 14 minutter og 59 sekunder at udføre ser jeg ingen grund til at stoppe timeren, men man kan ligeså godt køre den videre. og i så fald er arne og the_party_dog's (med lidt ekstra tweaking) forslag lige gode, og selv ville jeg nok gå efter det det sidste.

if (DateTime.Now.Minute % 15) && (DateTime.Now.Seconds == 0)
Avatar billede arne_v Ekspert
17. februar 2005 - 16:10 #8
Der er da ingen grund til at gøre det så besværligt. Microsoft har løst problemet.

Prøv og kør:

using System;
using System.Threading;

class MainClass
{
    private static Random rng = new Random();
    public static void Main(string[] args)
    {
        Timer t = new Timer(new TimerCallback(Test), null, 0, 10000);
        while(true) Thread.Sleep(1000);
    }
    static void Test(Object o)
    {
        Console.WriteLine("Start : " + DateTime.Now);
        Thread.Sleep(rng.Next(10) * 1000);
        Console.WriteLine("End  : " + DateTime.Now);
    }
}

Test starter præcist hver 10. sekund uanset hvorlænge den er om at afslutte.
Avatar billede segato Nybegynder
19. februar 2005 - 11:46 #9
Det jo derfor man har en timer class er enig med arne. Der findes også en server based timer i din toolbox den skulle være en anelse mere præcis. Men arnes er præcis og den bruger ikke alt det processor en while bruger.
Avatar billede Syska Mester
22. februar 2005 - 14:49 #10
Jo, nu har jeg kigget lidt mere på det, og det ser jo ud til at virke godt, men hvad ville du ske hvis min process tager længere tid end 10 sek med din version arne?

Tror det blive en kombination af Arne og jpvj, sådan at jeg kan starte det klokken 15.00 f.eks. og så bagefter bruge Arne's..

Men hvad vil du ske hvis det tager længere tid end de planlangte 15 mins?
Avatar billede arne_v Ekspert
22. februar 2005 - 15:26 #11
Test det ved at erstatte

Thread.Sleep(rng.Next(10) * 1000);

med

Thread.Sleep(rng.Next(20) * 1000);

Mit gæt er at det virker fint.
Avatar billede Syska Mester
22. februar 2005 - 16:35 #12
hmmm, tænke tænke, egentlig hælder jeg mest til "jpvj" da den ikke starter en ny process hvis den ikke er færdig, men det må jeg lige teste lidt mere med, for ellers ville det jo gå helt amok hvis de forskellige processes aldrig når at blive færdig, så går maskinen nok ned på tid tidspunkt eller løber tør for ram....

Men smid et svar begge....
Avatar billede arne_v Ekspert
22. februar 2005 - 16:37 #13
svar
Avatar billede arne_v Ekspert
10. april 2005 - 18:41 #14
så mangler du bare at acceptere
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester