IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Le temps est compté


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Le temps est compté
    Bonjour à tous,

    Depuis pas mal de temps j’utilise dans mes Services Windows une fonction qui active un Timer. Ce matin, en voulant adapter mes horaires entre mes Services je me suis rendu compte que le résultat d'un horaire était bon mais ne devrait pas l'être...

    Dans le texte What the F**


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Start := IncMinute(Now,MinutesTravaux);
      if HourOf(Now) = HeureFin then Start := IncHour(Today,HeureDebut);
     
      Timer1.Interval := MilliSecondsBetween(Now, Start);
     
      Log(
      'StartTimer : Now = '+FormatDateTime('dd/mm/yy hh:nn:ss',Now)+#13+
      'StartTimer : Start = '+FormatDateTime('dd/mm/yy hh:nn:ss',Start)+#13+
      'StartTimer : Interval = '+inttostr(Timer1.Interval));
    Valeur de MinutesTravaux = 5
    Valeur de HeureDebut = 10
    Valeur de HeureFin = 22


    Pour hier soir et précisément le 10/12/2018 à 22:01:02 voici le résultat du Log

    StartTimer : Now = 10/12/18 22:01:02
    StartTimer : Start = 11/12/18 10:00:00
    StartTimer : Interval = 43137573
    C'est exactement ce que je recherche mais cela ne devrait pas fonctionner ??
    IncHour(Today,HeureDebut);
    devrait me donner le 10/12/2018 à 10:00:00, non ?

    Je devrais utiliser ceci : IncHour(Tomorrow,HeureDebut);

    Et encore si l'heure Tomorrow est à 00 h 00 !! puisque j'ajoute IncHour()

    J'ai reproduit la procédure ailleurs dans un programme visuel, via un Tbutton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.sBitBtn3Click(Sender: TObject);
    var
      Start :TDateTime;
    Begin
    Start := StrToDateTime(DateToStr(Now())+'22:00:00') ;
    Voir(DateTimeToStr(Start));
    Start := IncHour(Date(),10);
    Voir('Ajout de 10 heures ' + dateTimeToStr(Start));
    end;
    Et là j'obtiens bien (pour aujourd'hui)
    11/12/2018 à 22:00:00
    ensuite
    11/12/2018 à 10:00:00

    Quelqu'un a-t-il déjà eu des soucis avec ce genre de manipulation ?

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Ton exemple est choquant...

    Que donne IncHour( DateOf(Now), 34) ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    cela faisait un bail !

    ce qui me dérange dans ton code c'est que tu utilises des dates (today, date, tomorrow) donc sans heures et des datetimes comme now le tout mâtiné avec des routines de conversion de date en chaine et l'inverse, ça donne le tournis !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Ton exemple est choquant...

    Que donne IncHour( DateOf(Now), 34) ?
    En fait Date() part à 00h00 d'où le fait que que j'ai bien 10h00 le jour demandé, quand je fais IncHour(Today,10)

    ==> ton exemple donnerai 14h00 le lendemain

    Oupss, je voulais dire ==> ton exemple donnerai 10h00 le lendemain

    Mais la n'est pas le problème, le souci c'est que j’utilise

    IncHour(Today,...) mais il me mets le jour au lendemain ce qui n'est pas normal !

    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    cela faisait un bail !

    ce qui me dérange dans ton code c'est que tu utilises des dates (today, date, tomorrow) donc sans heures et des datetimes comme now le tout mâtiné avec des routines de conversion de date en chaine et l'inverse, ça donne le tournis !
    Salut Serge,

    Je suis toujours là lol...

    Pour le tournis, tu parle de ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.sBitBtn3Click(Sender: TObject);
    var
      Start :TDateTime;
    Begin
    Start := StrToDateTime(DateToStr(Now())+'22:00:00') ;
    Voir(DateTimeToStr(Start));
    Start := IncHour(Date(),10);
    Voir('Ajout de 10 heures ' + dateTimeToStr(Start));
    end;
    --> c’était juste pour débuguer , j'utilise pas ça évidemment..


  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    re,

    oui, pour le tournis il s'agissait de ça !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Mes tests sous Tokyo 10.2.3 et Windows 10 donnent tous les résultats attendus, avec un comportement attendu des fonctions Date, Tomorrow et Today...
    IncHour(Today,...) mais il me met le jour au lendemain ce qui n'est pas normal !
    Ce n'est effectivement pas normal...
    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      Start := IncMinute(Now,MinutesTravaux);
      if HourOf(Now) = HeureFin then Start := IncHour(Today,HeureDebut);
     
      Timer1.Interval := MilliSecondsBetween(Now, Start);
     
      Log(
      'StartTimer : Now = '+FormatDateTime('dd/mm/yy hh:nn:ss',Now)+#13+
      'StartTimer : Start = '+FormatDateTime('dd/mm/yy hh:nn:ss',Start)+#13+
      'StartTimer : Interval = '+inttostr(Timer1.Interval));
    est-il complet ?
    Si j'ai bien compris, il sert à lancer une tâche toutes les 5 mn entre 10h et 22h. Le Timer est-il désactivé avant ton extrait de code et réactivé après ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Re

    Voilà le Timer entier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TServiceRetourCC.StartTimer;
    var
      Start :TDateTime;
    begin
      Timer1.Enabled := FALSE;
     
      Start := IncMinute(Now,MinutesTravaux);
      if HourOf(Now) = HeureFin then Start := IncHour(Today,HeureDebut);
     
      if Maintenant then Start := IncMinute(Now,1);
     
      Timer1.Interval := MilliSecondsBetween(Now, Start);
     
      Log(
      'StartTimer : Now = '+FormatDateTime('dd/mm/yy hh:nn:ss',Now)+#13+
      'StartTimer : Start = '+FormatDateTime('dd/mm/yy hh:nn:ss',Start)+#13+
      'StartTimer : Interval = '+inttostr(Timer1.Interval));
     
      Timer1.Enabled  := TRUE;
     
    end;
    Donc à part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Maintenant then Start := IncMinute(Now,1);
    Y a pas grand chose, Evidemment Maintenant est False. (je m'en sert pour forcer le Service à s'exécuter) en cas de besoin en faisant abstraction au autres critères.

    Et sinon au niveau des autres évenements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      ServiceEGPRetourCC.Controller(CtrlCode);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TServiceRetourCC.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure TServiceRetourCC.ServiceAfterInstall(Sender: TService);
    var
      Reg: TRegistry;
    begin
      Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
      try
        Reg.RootKey := HKEY_LOCAL_MACHINE;
        if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + Name, false) then
        begin
          Reg.WriteString('Description', 'Application permettant de récupérer les prévisions de livraison');
          Reg.CloseKey;
        end;
      finally
        Reg.Free;
      end;
      LectureINI;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TServiceRetourCC.ServiceContinue(Sender: TService;
      var Continued: Boolean);
    begin
      Continued := True;
      LectureINI;
      StartTimer;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TServiceRetourCC.ServiceExecute(Sender: TService);
    begin
      StartTimer;
      While not Terminated do
        ServiceThread.ProcessRequests(True);
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TServiceRetourCC.ServicePause(Sender: TService;
      var Paused: Boolean);
    begin
      Paused := True;
      Timer1.Enabled := False;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TServiceRetourCC.ServiceStart(Sender: TService;
      var Started: Boolean);
    begin
      Started := True;
      LectureINI;
      StartTimer;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TServiceRetourCC.ServiceStop(Sender: TService;
      var Stopped: Boolean);
    begin
      Stopped := True;
      Timer1.Enabled := False;
    end;
    AndNotOr se reconnaîtra dans ce code...

    Sinon à pour le Timer j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TServiceRetourCC.Timer1Timer(Sender: TObject);
    Var
      xxxxxxxxx
      xxxxxxxxx
    begin
     
      //
      //...
      //...
      //
     
      Maintenant := False;
      StartTimer;
    end;
    Rien de bien méchant donc.

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Mes tests sous Tokyo 10.2.3 et Windows 10 donnent tous les résultats attendus, avec un comportement attendu des fonctions Date, Tomorrow et Today...

    Ce n'est effectivement pas normal...

    Si j'ai bien compris, il sert à lancer une tâche toutes les 5 mn entre 10h et 22h. Le Timer est-il désactivé avant ton extrait de code et réactivé après ?
    Oui c'est exactement ça.

    En fait j'ai recompiler mon projet et le comportement est redevenu normal... c'est à dire que Today est bien Today (comme dirait Shakespaere... aarff à non c'est pas ça )

    Donc j'ai du forcément faire une erreur quelque part que j'ai forcément du corriger, le truc de dingue.

    Désolé du dérangement et merci encore.

  9. #9
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Bonjour,

    Petite question bête mais c'est quelle version de Delphi ?
    Et si c'est une version récente pourquoi ne pas utiliser Tstopwatch ? :

    http://docwiki.embarcadero.com/Libra...ics.TStopwatch

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Thierry Laborde Voir le message
    Bonjour,

    Petite question bête mais c'est quelle version de Delphi ?
    Et si c'est une version récente pourquoi ne pas utiliser Tstopwatch ? :

    http://docwiki.embarcadero.com/Libra...ics.TStopwatch
    Je suis en D2009.
    Je ne connais pas TStopWatch et a priori c'est un minuteur pour calculer le temps. Peut-être adaptable à mon cas, mais trop sophistiqué.

    Merci pour l'info.


  11. #11
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Peut-être adaptable à mon cas, mais trop sophistiqué.
    Non, non, super simple à mettre en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Uses Diagnostics;
     
     
    var
      StopWatch: TStopwatch;
      ElapsedMillseconds: Int64;
      Days, Hours, Minutes, Seconds, Milliseconds : Integer;
    begin
      StopWatch := TStopwatch.StartNew;
      // ----------
      // Traitement
      // ----------
     
      // 1ère méthode juste pour avoir les millisecondes écoulés depuis le start
      ElapsedMillseconds := StopWatch.ElapsedMilliseconds;
     
      // 2ème méthode pour avoir plus d'infos sur le temps écoulé depuis le start
      Days               := StopWatch.Elapsed.Days;
      Hours              := StopWatch.Elapsed.Hours;
      Minutes            := StopWatch.Elapsed.Minutes;
      Seconds            := StopWatch.Elapsed.Seconds;
      Milliseconds       := StopWatch.Elapsed.Milliseconds;
    end;

    Par contre oui malheureusement pas présent en D2009.

  12. #12
    Invité
    Invité(e)
    Par défaut
    A mon avis, le stopwatch, ne convient pas dans ce contexte.
    Cela sert à mesurer la durée d'un traitement, pas à exécuter des traitements à intervalles réguliers.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut Quelle est l'objet de ta foncion?
    Salut

    À quoi sert tout ce code.

    J'ai le flegme de me taper le code afin de comprendre à quoi il sert...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/09/2014, 13h45
  2. Réponses: 3
    Dernier message: 19/05/2011, 14h26
  3. Tableau, savoir si un temps est deja saisie
    Par Arnau6 dans le forum Débuter
    Réponses: 3
    Dernier message: 06/03/2011, 17h27
  4. [RegEx] URL + e-mail en même temps, est-ce possible ?
    Par jojodivx dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2010, 16h37
  5. Le temps est-t-il de plus en plus réduit?
    Par witch dans le forum La taverne du Club : Humour et divers
    Réponses: 105
    Dernier message: 10/06/2010, 16h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo