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

 Delphi Discussion :

Probleme avec MinuteOf


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut Probleme avec MinuteOf
    Bonjour
    Je boucle sur des TDatetime et execute un traitement toutes les x minute apres un simple test.
    Cela ne pose pas de pb quand le nombre de minutes à tester est pair ou un multiple de 5 mais s il est impair et differnt de 5, considerant mon code , le traitement s effectue toutes les heures précises 01:00:00 , 02:00:00 puisque le reste d'un division de zero par n'importe quoi est toujours 0 !!!

    Je n ai aucune idée de comment y remedier. Et pourtant j'ai cherché à preque m'arracher le peu de cheveux qui me reste

    Votre aide me serait précieuse et je vous en remercie par avance.

    Mon test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsMultipleOfMinutes(ADateTime: TDateTime; Mn: integer): Boolean;
    begin
      result := (MinuteOf(ADateTime) mod Mn = 0);
    end;

  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 302
    Points
    11 302
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Si une propriété ne suffit pas à vérifier ta condition, il sera sûrement profitable de s'intéresser aux écarts qu'elle exprime.
    En mémorisant la précédente occurrence retenue et avec MinutesBetween.
    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
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Ton code fonctionne bien chez moi.
    Testé comme 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    program Project3;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils,
      DateUtils;
     
    function IsMultipleOfMinutes(ADateTime: TDateTime; Mn: integer): Boolean;
    begin
      result := (MinuteOf(ADateTime) mod Mn = 0);
    end;
     
     
    var dates : array[0..5] of TDateTime;
        i : Integer;
    begin
      dates[0] := EncodeTime(10, 0, 0, 0);
      dates[1] := EncodeTime(10, 5, 0, 0);
      dates[2] := EncodeTime(10, 6, 0, 0);
      dates[3] := EncodeTime(10, 7, 5, 0);
      dates[4] := EncodeTime(10, 8, 0, 0);
      dates[5] := EncodeTime(10, 9, 59, 0);
     
      for i := 0 to 5 do
      begin
        Writeln(IntToStr(MinuteOf(dates[i])));
        Writeln('Multiple de 5 : ' + BoolToStr(IsMultipleOfMinutes(dates[i], 5), True));
        Writeln('Multiple de 6 : ' + BoolToStr(IsMultipleOfMinutes(dates[i], 6), True));
        Writeln('Multiple de 7 : ' + BoolToStr(IsMultipleOfMinutes(dates[i], 7), True));
        Writeln('Multiple de 8 : ' + BoolToStr(IsMultipleOfMinutes(dates[i], 8), True));
        Writeln('Multiple de 9 : ' + BoolToStr(IsMultipleOfMinutes(dates[i], 9), True));
        Writeln;
      end; 
      Readln;
    end.
    Renvoie 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    0
    Multiple de 5 : True
    Multiple de 6 : True
    Multiple de 7 : True
    Multiple de 8 : True
    Multiple de 9 : True
     
    5
    Multiple de 5 : True
    Multiple de 6 : False
    Multiple de 7 : False
    Multiple de 8 : False
    Multiple de 9 : False
     
    6
    Multiple de 5 : False
    Multiple de 6 : True
    Multiple de 7 : False
    Multiple de 8 : False
    Multiple de 9 : False
     
    7
    Multiple de 5 : False
    Multiple de 6 : False
    Multiple de 7 : True
    Multiple de 8 : False
    Multiple de 9 : False
     
    8
    Multiple de 5 : False
    Multiple de 6 : False
    Multiple de 7 : False
    Multiple de 8 : True
    Multiple de 9 : False
     
    9
    Multiple de 5 : False
    Multiple de 6 : False
    Multiple de 7 : False
    Multiple de 8 : False
    Multiple de 9 : True

  4. #4
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 931
    Points : 1 909
    Points
    1 909
    Par défaut
    Bonjour,

    J'ai aussi testé la fonction, elle fonctionne bien. Faudrait voir la boucle avec l'appel à cette fonction, le problème est surement à ce niveau.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Citation Envoyé par DarwinTheBeagle Voir le message
    Je boucle sur des TDatetime
    Ca m'étonnera toujours qu'on préfère "boucler et contrôler" plutôt que de fixer clairement l'heure d'exécution d'un événement.

    Que ce soit avec un simple TTimer Timer1.Interval := MilliSecondsBetween(Time, StrToTime('11:05'));, un ThreadPoolTimer (qui permet de fixer directement date/heure) ou si on a besoin de beaucoup de timers tout en restant "léger" en ressources, d'un TimerQueueTimer.

  6. #6
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Merci pour vos réponses.
    En effet, le comportement décrit est logique mais je voudrais ne travailler que, par exemple pour un multiple de 6, les minutes 6,12,18,26,32,38,42,48,54 et donc ne pas sélectionner un heure style 10:00:00 donc obtenir ce type de résultats :
    0 (10:00:00)
    Multiple de 5 : FALSE
    Multiple de 6 : FALSE
    Multiple de 7 : FALSE
    Multiple de 8 : FALSE
    Multiple de 9 : FALSE
    @Andnotor : Dans mon cas je boucle sur un csv que je colle dans un objet et dont je parcours les dates....

  7. #7
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Bon, finalement en réfléchissant autrement j'y suis arrivé avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function IsMultipleOfMinutes(ADateTime: TDatetime; Mn: integer): Boolean;
    var
      Minutes: integer;
    begin
      Minutes := MinuteOf(ADateTime);
      if (Minutes = 0) and ((Mn mod 5 <> 0) or (Mn = 45)) then
        Minutes := 100;
      result := (Minutes mod Mn = 0);
    end;

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    En fait ce qui te pose problème est uniquement l'heure précise (ce qui ne ressortait pas vraiment de ton premier message).

    Donc juste un p'tit test comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function IsMultipleOfMinutes(ADateTime: TDateTime; Mn: integer): Boolean;
    begin
      if MinuteOf(ADateTime) = 0
      then Result := Mn = 0
      else Result := MinuteOf(ADateTime) mod Mn = 0;
    end;

  9. #9
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Je te remercie mais non cela ne correspond pas à mes besoins car je dois traiter quand il s agit par exemple de toutes les 15 minutes. L heure juste est pour moi un multiple de 15 minutes et de 6 aussi mais je m aperçois qu avec mon code ça ne le fait pas.
    Mais en changeant ainsi, tout est correct.
    Mais si tu connais une meilleure solution ( en termes de perfs ou même de code pour apprendre), je suis preneur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function IsMultipleOfMinutes(ADateTime: TDatetime; Mn: integer): Boolean;
    var
      Minutes: integer;
    begin
      Minutes := MinuteOf(ADateTime);
      if (Minutes = 0) and ((Mn mod 5 <> 0) or (Mn = 45)) then
        Minutes := 60;
      result := (Minutes mod Mn = 0);
    end;

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Compare alors juste le nombre de minutes depuis minuit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsMultipleOfMinutes(ADateTime: TDateTime; Mn: integer): Boolean;
    begin
      Result := MinutesBetween(ADateTime, Date) mod Mn = 0;
    end;
    Tu peux même remplacer Date par 0

  11. #11
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Compare alors juste le nombre de minutes depuis minuit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsMultipleOfMinutes(ADateTime: TDateTime; Mn: integer): Boolean;
    begin
      Result := MinutesBetween(ADateTime, Date) mod Mn = 0;
    end;
    Tu peux même remplacer Date par 0
    Je te remercie.
    Juste pour savoir,pourquoi Date ne retourne aucune erreur étant donné qu elle n est déclarée nulle part ?
    J ai cherché sur https://docwiki.embarcadero.com/Libr...MinutesBetween mais pas explicite sur ce point là...
    Merci

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Date est une fonction déclarée dans SysUtils.

  13. #13
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Date est une fonction déclarée dans SysUtils.
    Merci

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

Discussions similaires

  1. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  2. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  3. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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