Ajoitus

ajoittaja

Miten tehdä ajastettu tapahtuma täysinä viisinä minuutteina.

Siis esim. kello 12:00:00, 12:05:00, 12:10:00 jne..

3

632

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • -_.A._-

      Lisää Form:lle Timer-komponentti. Laita se keskeyttämään sekunnin välein (Eli enabled ominaisuus true ja interval ominaisuus 1000. Tee sille OnTimer tapahtuma. Täydennä sitä niin että siitä tulee tälläinen:


      procedure TForm1.Timer1Timer( Sender: TObject );
      var
      vuosi,kuu,vrk,tunti,minuutti,sekunti,millisekunti:word;
      begin
         DecodeDateTime( Now, vuosi, kuu, vrk, tunti, minuutti, sekunti, millisekunti);
         if (( minuutti mod 5 ) = 0 ) and ( sekunti = 0 ) then
            begin // tasan viiden minuutin ajoitus         
               ShowMessage('nyt');
            end;
      end;

      Ota käyttöön myös DateUtils -unit. Se tapahtuu lisäämällä ohjelma alussa olevaan
      Uses-lauseen loppuun muiden unit:tien joukkoon pilkulla erotettuna DateUtils -sana.

      Aliohjelman toiminta on seuraava. Funktio Now palauttaa tämän hetkisen kellon ajan.
      Kellon aika on tyyppia TDateTime. Aliohjelma DecodeDateTime muuttaa TDateTime -tyyppiä olevan ajan kuudeksi word - tyyppiseksi kokonaisluvuksi. If -lausessa katsotaan ensiksi onko minuuttien jakojäännös nolla ja onko sekunti nolla. Jos näin on niin näytetään nyt-teksti (en viitsinyt keksiä
      tähän parempaa esimerkkiä).

      • Delphiguru

        Nimimerkin "-_.A._-" vastaus on hyvä alku.

        Pari täsmennystä:

        1. Teoriassa esitetty ratkaisu toimii hyvin.
        Mutta käytännössä tuossa on yksi ongelma:

        Entä, jos vaikkapa juuri klo 12:05:00 koneen CPU on erittäin kiireinen ?

        Huonolla onnella saattaa käydä näin:

        TTimer -komponentti kustuu tuota "TForm1.Timer1Timer" -tapahtumakäsittelijää.

        Now palauttaa ajan: 12:04:59.xxx

        Jostakin syystä prosessorilla on liikaa muuta työtä juuri klo 12:05:00, joten se ei valitettavasti ehdi silloin kutsua tuota em. tapahtumakäsittelijää.

        Kun tapahtumakäsittelijää seuraavan kerran kutsutaan, Now palauttaa 12:05:01.xxx

        Koska nyt sekunti 0, niin tuota ShowMessage('nyt'); EI kutsuta.

        Tällaisissa tapauksissa on syytä miettiä, kumpi on pienempi paha, jos käy niin ikävästi, että kellorutiinia ei kutsuta juuri sillopin kun haluttaisiin ( ja näin voi moniajokäyttöjärjestelmässä käydä, joko käyttöjärjestelmän, toisen ajettavan sovelluksen tai jopa samankin sovelluksen tekemän muun tehtävän takia ):

        Onko pienempi paha se, että tällöin yksi 5 min välein laukaistava tapahtuma jää väliin (kuten esimerkkikoodi toimii), vai se, että laukaistava tapahtuma suoritetaan senverran myöhässä, kuin on tarpeen.

        Yleensä tuota jälkimmäistä pidetään pienempänä pahana, ja jos tuota ratkaisua halutaan, itse tekisin sen näin:

        var
        vanha_Kello_5m : Integer = -1;

        procedure TForm1.Timer1Timer( Sender: TObject );
        var
        DT1 : TDateTime;
        Kello_5m : Integer;

        begin
        DT1 := Now;
        //
        DecodeDateTime( DT1, vuosi, kuu, vrk, tunti, minuutti, sekunti, millisekunti);

        Kello_5m := (tunti*12) (minuutti DIV 5);

        if Kello_5m vanha_Kello_5m then begin

        vanha_Kello_5m := Kello_5m;
        ShowMessage('aika on nyt:' FormatDateTime('yyyy-mm-dd hh:nn:ss',DT1) );

        end;

        Tässä tapauksessa prosessorin pitäisi olla todella kiireinen vuorokauden putkeen, ennen kuin ohjelma toimisi siten väärin, että se jättäisi väliin jonkin 5s jaollisen kellonajan muusta syystä kuin siksi, että prosessori on 5 min niin kiireinen, ettei se tuona 5 min aikana ehdi kutsua tapahtumakäsittelijää ollenkaan.

        Käytännössä tuo esimerkkikoodi toki sellaisenaankin useissa tapauksissa toimii. Mutta se ei ole mitenkään 100% varmaa.

        Lopuksi vielä alkuperäiseen kysymykseen liittymätön kommentti:

        Nimimerkki "-_.A._- " on ilmeisesti tehnyt kätevän ohjelman tekstin oikein muotoiltua copypasteamista varten Delphistä tänne forumille.

        Täytyypä kokeilla ideaa myöhemmin. Toistaiseksi itselläni ei ole käytössä vastaavaa ohjelmaa, ja siksi tämänkin viestin ulkoasu ei ole paras mahdollinen...


    • masterD

      Alla tuo delphin koodi, en ole optimoinut koodia ja pätkä tehty vain esittämään kuinka paljon helpommin tämän voi tehdä kuin aiemmin esitetyt, kommentit suomeksi varmuuden vuoksi, eli alla oleva koodi on helppo muuttaa siten että voidaan ajastaa vain jonkin (päivän, kuun vuoden, tunnin) x minuutilla liipaisemaan tapahtuma...Ainut asia mikä estää tuon tapahtuman laukeamisen x minuutin välein on se, että jos itse tapahtuma vie enemmän aikaa kuin liipaisun aika on..




      procedure TForm1.FormCreate(Sender: TObject);
      begin
      // Aseta nykyinen aika globaaliin "luokan sisäiseen" muuttujaan (FLastTime : TDateTime)
      // Tämä aika on syytä asettaa juuri ennen kellon aktivointia, jotta päästään mahd. tarkaan liipaisuun
      FLastTime := Now;
      end;

      procedure TForm1.Timer1Timer(Sender: TObject);
      const
      MY_DELAY = 5;
      begin
      // Katsotaan onko 5 minuuttia tai yli kulunut
      if (MinutesBetween(FLastTime, Now) >= (1 * MY_DELAY)) then
      begin
      // Aseta edellinen aika nyt tai tapahtuman jälkeen, riippuen
      // ohjelman kriteereistä
      FLastTime := Now;

      // Tee jtn...
      ShowMessage(IntToStr(MinutesBetween(FLastTime, Now)) ' Kulunut...');
      end
      else Self.Caption := 'Seuraava tapahtuma ' (IntToStr((MY_DELAY * 60) - SecondsBetween(FLastTime, Now))) ' sekunnin kuluttua: ';
      end;

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Voiko normaali ihminen ryhtyä vasemmistolaiseksi?

      Tätä jäin pohdiskelemaan.
      Maailman menoa
      203
      4276
    2. SDP haluaa 40 000 nettomaahanmuuttajaa

      SDP:n Suunnanmuutos-vaihtoehtobudjetissa, käy ilmi, että demarit itse asiassa vaativat räjähdysmäistä ”työperäisen” maah
      Maailman menoa
      146
      3798
    3. Orpo: Velkajarrua vastustavaa puoluetta vaikea ajatella hallitukseen

      No Minja Koskelan kommunistipuolue jäi ulos tuosta. Kaikki eduskuntapuolueet vasemmistoliittoa lukuun ottamatta sopivat
      Maailman menoa
      137
      3261
    4. Hienoa! Eduskunta luopui käteisen käytöstä

      Nyt tuo sama muutos pitää saada myös muuhun yhteiskuntaan. Käteistähän ei tarvitse tänä päivänä enää kuin rikolliset.
      Maailman menoa
      52
      1638
    5. Ikävä sinua mies

      Vuosia kuluu, mutta tunteet ei ole hävinnyt. Tasoittuneet toki, kun ei olla nähty. Järki palannut päähän kuitenkin. Se i
      Ikävä
      19
      1558
    6. Mikä tämä henkilö mahtaa touhuta Parkanossa

      Kamalaa https://www.ylasatakunta.fi/teksti/pirkanmaan-karajaoikeus-vangitsi-koiran-tappamisesta-epaillyn-6.68.127794.b58
      Parkano
      34
      1520
    7. Sulla on avaimet ja keinot

      Jos haluat jatkaa tutustumista. Itse olen niin jäässä etten pysty tekemään enää mitään. Pidempi keppi johon on helpompi
      Ikävä
      25
      1395
    8. Orpo loukkaantui fasismiin viittaavasta sanavalinnasta

      Mutta miksi loukkaantui? Orpohan on tehnyt yhteistyötä fasistien kanssa jo vuonna 2019, siis jo neljä vuotta ennen loukk
      Maailman menoa
      27
      1351
    9. Kiinnostaa - ei kiinnosta - kiinnostaapas

      Selittäkää hämmentyneelle miksi miehiä ei ikinä kiinnosta silloin, kun sitä olisi itsekin kiinnostunut? Sitten kun siirt
      Sinkut
      117
      1175
    10. Martina haluaa Marbellaan

      Martinan tekisi mieli ottaa lennot Marbellaan, jossa näkisisi kauniita ja hyväntuulisia ihmisiä. No sitten pitää matkust
      Kotimaiset julkkisjuorut
      215
      1063
    Aihe