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

Python Discussion :

une" boucle" à heure fixe (h, h+15, h+30, h+45 etc ? [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    commercant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : commercant
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut une" boucle" à heure fixe (h, h+15, h+30, h+45 etc ?
    Bonjour a tous

    Voici mon problème, j’ai fait un programme de balise météo radioamateur, donc je récupère les infos des sondes (température, pression, vitesse et direction du vent) puis je les transmet sur une fréquence radio par synthèse vocal toutes les 15 minutes (en fait, un time.sleep 900 secondes) le problème est que la durée de transmission varie de quelque secondes suivant les données a émettre . et donc après quelques heures le rythme du quart d’heure est perdu.
    Comment faire pour que mes émissions débutent régulièrement à H, H+15, H+30, H+45, …etc. ?
    d' avance merci
    Philippe

  2. #2
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 425
    Par défaut
    Bonjour,
    En utilisant le module time
    https://docs.python.org/2/library/time.html
    En gros :
    tant que 1
    lancer l'action
    stocker time_initial = time.time()
    tant que time.time() - time_initial > 900s, on attend

  3. #3
    Membre du Club
    Homme Profil pro
    commercant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : commercant
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    Bonjour Fatbob

    Merci pour la réponse rapide. Ca me semble bien pour respecter les 15 minutes, mais en fait, serait il possible de lire l’heure et que le lancement de l’action intervienne à (exemple) 08h00,
    Puis 08h15, puis 08h30 etc ? et si je démarre mon programme à 08h07, la première action à 08h15 ?
    Bonne journée
    Phil

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Le problème de ces solutions c'est qu'elles occupent inutilement la machine.

    Le time.sleep() est bloquant et le "tant que time.time() - time_initial > 900s, on attend" fait tourner le bouzin à pleine charge.

    Python possède un module Timer fait pour cela.

    Exemple:
    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
     
    from threading import Timer
     
    def get_infos():
        """Retourne les donnees des capteurs"""
     
    def update():
        """Releve les donnees et les transmet"""
        set_timer()
        data = get_infos()
        send_data(data)
     
    def set_timer():
        t = Timer(900, update).start()
     
    def main():
        set_timer()
    Tu remarqueras que le timer est relancé avant le traitement pour que le temps nécessaire à celui-ci n'aie pas d'incidence sur le temps total.


    Edit: Nous nous sommes croisés. Pour démarrer à heure fixe, tu peux lire l'heure avec le module time et calculer les minutes manquantes pour le prochain quart d'heure et utiliser un autre Timer pour le premier démarrage.

    minutes_manquantes = 15 - minutes_actuelles % 15

  5. #5
    Membre du Club
    Homme Profil pro
    commercant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : commercant
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    merci Vincent
    pour la réponse, la ça devient un peut ardu pour mon faible niveau en python
    j' étudie ça et je reviens quand j'ai compris...(ça peut être long )

    phil

  6. #6
    Membre du Club
    Homme Profil pro
    commercant
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : commercant
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Par défaut
    bonjour à tous

    j'ai résolu mon problème! en tâtonnant, je suis arrivé à cela.
    ce n'est peut être pas très "orthodoxe" mais ça fonctionne.

    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
    # script à_heure.py
     
    import datetime   # le but est de relancer une procedure tous les quarts d'heure
    import time
     
    i = 0
    while 1:
     
        h = datetime.datetime.now().strftime('%M,%S') # control des minutes et secondes
     
        if h == "15,00" or h == "30,00" or h == "45,00" or h == "00,00": # à h+15minutes et 00 secondes...etc
     
            print("Ca fait un quart d' heure!!")
     
            time.sleep(1) # une petite seconde d'attente pour eviter les repetitions et on boucle.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 790
    Par défaut
    Salut,

    Citation Envoyé par LHT50 Voir le message
    ce n'est peut être pas très "orthodoxe" mais ça fonctionne.
    Votre code suppose que datetime.datetime.now() sera exécuté tous les quarts d'heure "pile poil" pour que le test "h == "15,00" or h == "30,00" or h == "45,00" or h == "00,00"" retourne vrai quand vous le voulez.
    Dans la pratique, ce sera rarement "pile poil" et donc, vous allez sauter des quarts d'heure.

    Ceci dit çà marche parce que vous "bouclez" à exécuter datetime.datetime.now(), autrement dit, vous consommez un CPU juste pour regarder le temps qui passe.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2015, 21h13

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