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

C Discussion :

[Time.h] Programme Horloge


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut [Time.h] Programme Horloge
    Bonjour,


    Je souhaiterai faire un programme "horloge-like".

    C'est-à-dire un programme qui donne l'heure en temps réel (donc qui s'actualise)
    et pour chaque heure, déclenche une animation.


    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
     
    int main(void)
    {
        time_t     now;
        struct tm  *ts;
        char       thetime[100];
        char       thehour[10];
     
        /* Récupération du temps */
        now = time(NULL);
     
        /* Affichage de l'heure sous forme : jjj aaaa-mm-jj h:min:sec */
        ts = localtime(&now);
        strftime(thetime, sizeof(thetime ), "%a %Y-%m-%d %H:%M:%S ", ts);
        printf("%s\n", thetime);
     
        /*Pour chaque heure */
        strftime(thehour, sizeof(thehour), "%H", ts);
        if(strcmp(thehour,"00")==0)
        {
            printf("Il est minuit");
        }
        //etc pour chaque heure
     
        return 0;
    }

    Voilà le code.

    Mon problème est de savoir :
    Quel est le meilleur moyen pour actualiser l'heure ?
    Faut-il faire une boucle while infini ? J'aime pas vraiment ce genre de boucle qui "handicape" plus ou moins le programme.


    Cordialement,
    B.Azerty

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Une boucle while infinie provoquerait une attente active et ce n'est effectivement pas souhaitable. Par contre, l'écoulement étant par nature prévisible, stable et absolu (hors effets relativistes que l'on peut sans risque se permettre de négliger :-), un bête sleep (1); serait peut-être tout-à-fait approprié.

    Quoi qu'il en soit, si tu n'as pas besoin de faire un programme qui soit portable jusque sur des architectures anté-diluviennes, moi j'utiliserais les timers POSIX timer_create() et timer_settime(), car ce dernier propose un flag TIMER_ABSTIME qui te permettra de t'aligner au plus juste sur la prochaine seconde (ou tout autre moment de la journée) ainsi qu'un compteur périodique qui te permettra de demander au système de t'interrompre toutes les secondes. Avec un petit réajustement toutes les minutes pour être sûr que l'on n'avance ni ne retarde, et tu devrais obtenir un programme très sobre en ressources CPU.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut
    Merci beaucoup pour la réponse.


    Si j'utilise sleep(1), il faut que j'utilise une boucle while principale englobant le tout, est-ce bien cela ?


    Concernant la deuxieme partie de la réponse.
    Je dois avouer n'avoir jamais utiliser les fonctions timer_create(), timer_settime().
    (Je ne connaissais même pas leur existance ).


    J'aurais donc aimer savoir comment les intégrer à mon code ?

    Parce que même en Googlant ces fonctions, je tombe sur des explications pas très explicite à mon niveau.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par BabyAzerty Voir le message
    Merci beaucoup pour la réponse.


    Si j'utilise sleep(1), il faut que j'utilise une boucle while principale englobant le tout, est-ce bien cela ?
    Oui. Il y a des programmes qui le font, d'ailleurs, pour éviter une attente active même si leur programme n'a une réactivé qu'à la seconde. C'est quand même sale parce que ça fait des tops toutes les secondes qui sont visibles et qui finissent par faire beaucoup quand ils sont cumulés.

    Par contre, dans ton cas, c'est exactement ce que tu veux puisque l'état de ton horloge doit être mis à jour toutes les secondes.

    Concernant la deuxieme partie de la réponse.
    Je dois avouer n'avoir jamais utiliser les fonctions timer_create(), timer_settime().
    (Je ne connaissais même pas leur existance ). J'aurais donc aimer savoir comment les intégrer à mon code ? Parce que même en Googlant ces fonctions, je tombe sur des explications pas très explicite à mon niveau.
    Regarde dans les man pages. Le prototype et la description de chacune d'elles s'y trouve.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut
    Si je baisse le Sleep à 0.5 ou même 0.45, ca ne consommerait pas trop de CPU ou suffisamment pour défoncer la batterie d'un portable en 20 min ?


    Je regarde les man pages de suite !

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Si je baisse le Sleep à 0.5 ou même 0.45, ca ne consommerait pas trop de CPU ou suffisamment pour défoncer la batterie d'un portable en 20 min ?
    Ce n'est pas la durée sleep() qui va compter, mais plutôt ce que tu vas faire entre les deux, plus les coûts du réveil, des accès disque éventuels, etc. Un top à 0.5 ne va pas influer beaucoup sur la consommation, mais va assurément se voir sur la consommation du processus sur le long terme. Un admin qui regarde la liste des tâches va donc voir ton programme caracoler en tête de liste et va se demander pourquoi un truc aussi bête qu'une horloge ne passe pas le plus clair de son temps en sommeil.

    Il faut savoir qu'un CPU ne fonctionne pas comme un moteur à explosion : un micro-processeur ne s'arrête jamais de travailler (sauf instruction HLT). Lorsque l'on ne consomme que quelques pourcents du CPU, c'est parce qu'il passe le plus clair de son temps dans une boucle infinie à attendre qu'on l'envoie vers une routine plus utile mais, en pratique, ça ne change pas grand chose pour lui.

    Ce qui change beaucoup la donne, c'est l'échelonnement de la fréquence, c'est-à-dire la capacité des architectures modernes à faire fonctionner le CPU en dessous de sa fréquence nominale, là où c'est beaucoup moins gourmand en énergie, pour ne le faire remonter que lorsque c'est vraiment utile.

    La réponse est donc dans le gestionnaire de ton système d'exploitation. S'il n'y en a pas, la question ne se pose pas. Sinon, il vaut voir quelle politique il applique. En général, on attend que la charge système moyenne se stabilise au dessus d'un certain niveau avant de déclencher le changement (sur une période de l'ordre d'une à deux secondes). À toi de faire des tests, donc.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Par défaut
    Et bien merci beaucoup pour ce petit cours sur le CPU ^^

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Si ça marche, n'oublie pas le bouton !

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

Discussions similaires

  1. Programmation sous TIME NAVIGATOR
    Par howie42 dans le forum Windows
    Réponses: 4
    Dernier message: 28/06/2013, 16h18
  2. Réponses: 5
    Dernier message: 15/01/2007, 21h15
  3. Horloge interne pb de Time and Date
    Par Max Payne dans le forum Composants
    Réponses: 6
    Dernier message: 30/07/2005, 21h30
  4. [LG]Pause de programme ou Break time
    Par lvdnono dans le forum Langage
    Réponses: 11
    Dernier message: 17/05/2003, 17h23

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