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 :

attente passive d'un evenement toutes les heures


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut attente passive d'un evenement toutes les heures
    bonjour,

    j'aurais besoin d'effectuer une opération toutes les heures précisement sur un programme assez chargé. Mais pour m'y prendre je voudrais utiliser une méthode rapide et qui ne mange pas trop le proc, car pour l'instant comme solution j'ai trouvé uniquement le moyen de scruter l'heure a chaque fois que je passe dans ma boucle.
    j'ai aussi pensé à une autre à deux threads. Un qui compte et un qui execute le programme. Mais d'un point de vue occupation processeur c'est la même chose finalement..


    si vous avez d'autres idées ou alors la solution universelle
    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    utilises les timers.... ou les signaux.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par bonjour69
    j'ai aussi pensé à une autre à deux threads. Un qui compte et un qui execute le programme. Mais d'un point de vue occupation processeur c'est la même chose finalement..


    si vous avez d'autres idées ou alors la solution universelle
    Merci
    Si tu endors ton deuxième thread pendant une heure, il utilisera très peu de ressources voir rien du tout. Au réveil, tu fais ton traitement et tu le rendors. Attention aux sections/données critiques, c'est tout.

    - Utiliser alarm si tu ne souhaites pas faire quelque chose de portable (je ne pense pas que cela existe sous Windows)

    - Plus moche mais cela dépend de ce que tu peux/veux faire : utiliser un deuxième programme qui connait le numéro de processus à contrôler et envoyer un signal toutes les heures au programme cible. Attention, il ne faut pas que le programme masque les signaux pendant que tu tentes de lui envoyer un signal -> presque pareil que la solution thread par contre c'est le programme qui va s'interrompre donc ton traitement mettra en attente le reste, cela peut être pratique.

    Jc

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut
    bonjour,
    merci pour les réponses elles sont interéssantes par contre :


    Si j'utilise un thread comme je fais pour lui dire que dans une heure il va falloir se reveiller sans faire une attente active ?

    Merci

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ben tu peux utiliser les timers comme j'avais dit, et c'est beaucoup plus simple :

    D'abord les includes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <signal.h>
     
    #ifdef WINDOWS
    #include <sys/time.h>
    #else
    #include <time.h>
    #endif

    Dans la fonction qui doit appeller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      struct itimerval   rttimer, old_rttimer;
     
    .....
     
      /* mets les paramètres pour une heure */
     
      rttimer.it_interval.tv_sec  = 3600 ;
      rttimer.it_interval.tv_usec = 0 ;
     
      /* déclenche l'attente */
     
      signal ( SIGALRM, (void (*)())Timer_Expiration );
      setitimer (ITIMER_REAL, &rttimer, &old_rttimer);
    et dans la routine appellée lors de l'expiration :

    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
     
    void Timer_Expiration ( void )
    {
      struct itimerval   rttimer, old_rttimer;
     
       /* Effectue le code qui dot être fait */
    .....
    ......
     
      /* remets les paramètres pour une heure */
     
      rttimer.it_interval.tv_sec  = 3600 ;
      rttimer.it_interval.tv_usec = 0 ;
     
      /* re-déclenche l'attente */
     
      signal ( SIGALRM, (void (*)())Timer_Expiration );
      setitimer (ITIMER_REAL, &rttimer, &old_rttimer);
    }
    c'est nettement plus simple, à mon avis, que d'utiliser des threads ou autres...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Hmm cela me semble bizarre souviron34, serait-ce possible d'avoir un petit exemple qui affiche "Hello World\n" toutes les 5 secondes ?

    Jc

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut
    Bonjour,


    ha cela peut être parfait !
    par contre je n'arrive pas a compiler sous dev-cpp, voici le code :
    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
    42
    43
    44
    45
     
    #include <signal.h>
     
     
    #ifdef WINDOWS
    #include <sys/time.h>
    #else
    #include <time.h>
    #endif
     
     void Timer_Expiration ( void )
    {
      struct itimerval rttimer;
     
       /* Effectue le code qui dot être fait */
       printf("ok timer");
     
      /* remets les paramètres pour une heure */
     
      rttimer.it_interval.tv_sec  = 3600;
      rttimer.it_interval.tv_usec = 0 ;
     
      /* re-déclenche l'attente */
     
      signal ( SIGALRM, (void (*)())Timer_Expiration );
    }
     
     
     int main ()
     { 
         struct itimerval   rttimer;
     
     
      /* mets les paramètres pour une heure */
     
      rttimer.it_interval.tv_sec  = 3600 ;
      rttimer.it_interval.tv_usec = 0 ;
     
      /* déclenche l'attente */
     
      signal ( SIGALRM, (void (*)())Timer_Expiration );
     
     return 0;
     
     }
    et voici les erreurs
    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
     
     
    C:\Documents and Settings\r\Bureau\signal.c: In function `Timer_Expiration':
     
    C:\Documents and Settings\r\Bureau\signal.c:8: error: storage size of 'rttimer' isn't known
     
    C:\Documents and Settings\r\Bureau\signal.c:20: error: `SIGALRM' undeclared (first use in this function)
     
    C:\Documents and Settings\r\Bureau\signal.c:20: error: (Each undeclared identifier is reported only once
     
    C:\Documents and Settings\r\Bureau\signal.c:20: error: for each function it appears in.)
     
    C:\Documents and Settings\r\Bureau\signal.c: In function `main':
     
    C:\Documents and Settings\r\Bureau\signal.c:26: error: storage size of 'rttimer' isn't known
     
    C:\Documents and Settings\r\Bureau\signal.c:36: error: `SIGALRM' undeclared (first use in this function)
     
    Execution terminated
    Merci

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le signal SIGALRM n'existe pas sous Windows.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fearyourself
    Hmm cela me semble bizarre souviron34, serait-ce possible d'avoir un petit exemple qui affiche "Hello World\n" toutes les 5 secondes ?

    Jc
    oui c'est vrai que ça ne marche pas si tu es dans une opération qui occupe tout le CPU (exemple une boucle infinie).

    De plus, j'avais oublié un truc, le setitmet (que j'include quand même, même si le code n'est pas correct pour ce problème).
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    Le signal SIGALRM n'existe pas sous Windows.

    oui OK je ne savais pas.. milles excuses ..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ok alors désolé bonjour69 ma solution n'est pas la bonne...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Points : 44
    Points
    44
    Par défaut
    Bon et bien je crois que la seule solution est un thread, mais ma question reste la même comment lui faire attendre une heure sans qu'il fasse de l'attente active :/
    Merci

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    sleep(3600) sous unixoïde et Sleep(3600*1000) sous Windows ?
    (ou plus complexe s'il faut pouvoir réveiller le thread avant la fin quand on veut quitter le programme).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [10g] Switch log et archivage toutes les heures
    Par star dans le forum Oracle
    Réponses: 13
    Dernier message: 09/09/2012, 18h57
  2. [9i] CREATE MATERIALIZED VIEW toutes les heures sauf le WE
    Par Débéa dans le forum Administration
    Réponses: 3
    Dernier message: 20/03/2007, 15h42
  3. [Système] Afficher un texte toutes les heures
    Par morgan47 dans le forum Langage
    Réponses: 4
    Dernier message: 16/12/2006, 23h39
  4. grouper des evenements toutes les 10 minutes
    Par aline dans le forum Oracle
    Réponses: 2
    Dernier message: 16/11/2005, 13h53
  5. Envoi automatique d'un mail toutes les heures
    Par VirginieGE dans le forum ASP
    Réponses: 8
    Dernier message: 24/08/2004, 08h10

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