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 :

[Débutant]Problème avec un timer


Sujet :

C

  1. #1
    Fabouney
    Invité(e)
    Par défaut [Débutant]Problème avec un timer
    Bonjour à tous et à toute,

    voila en fait mon problème c'est que je souhaite intégré un à mon programme pour qu'il execute une fonction toute les 5 minutes.
    mon programme est un bot irc, donc il y a une boucle principale qui tourne des que le bot est lancé, quand j'inclus la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (GetMessage(&msg, NULL, 0, 0)){
    ...
    }
    est bien la boucle principale bug, ca me surprend presque pas, alors ma question est la suivante :

    comment puis-je incruster mon timer dans la boucle principale sans pour autant la perturber.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Qu'est-ce que ta "boucle principale" ?
    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.

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il faudrait voir où ca bug déja avant de faire ça Pour lancer un timer sous Windows il faut chercher du côté de SetTimer/KillTimer

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Par défaut
    A mon avis, tu devrais également voir à faire des threads plutôt qu'une boucle principale comme tu dis, à voir selon ton application mais ca permet de délester le proc, et peut améliorer la rapidité de ton programme.
    Ton programme principal contient le timer et le thread tourne à côté, et lorsque tu as atteint le temps limite, tu envoie une interruption à ton thread.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Citation Envoyé par guilig
    A mon avis, tu devrais également voir à faire des threads plutôt qu'une boucle principale comme tu dis, à voir selon ton application mais ca permet de délester le proc, et peut améliorer la rapidité de ton programme.
    Ton programme principal contient le timer et le thread tourne à côté, et lorsque tu as atteint le temps limite, tu envoie une interruption à ton thread.
    Euh... ça ne déleste pas tellement le proc, à moins d'en avoir deux (ou un dual-core ou hyperthreadé).
    Et avant de savoir ce qu'il faut, il faudrait déjà savoir comment est l'existant.


    Je répète donc ma question: Qu'est-ce qu'il y a dans la "Boucle principale" ?
    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.

  6. #6
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    Si tu ne veux pas trop de précision, tu peux lire le nombre de millisecondes écoulées depuis un top départ et ensuite le comparer à une constante (ici, 5 minutes); 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <stdlib.h>
    #include <windows.h>
     
    #define MDELAI(S)  ((S)*60*1000)
    #define SDELAI(S)  ((S)*1000)
     
    DWORD start[2] ;
     
    int main(void)
    {
      start[0] = GetTickCount() ;  // Lecture du Nb de millisecondes
      start[1] = start[2] ;        // Même top départ
      while(1)
      {
        // Execute un code toute les 5 minutes
        if((GetTickCount()-start[0])>MDELAI(5))
        {
          // Ici ton code ....
     
          start[0] = GetTickCount() ;  // Réinitialise le top départ #1
        }
     
        // Execute un code toute les 33 secondes
        if((GetTickCount()-start[1])>SDELAI(33))
        {
          // Ici ton code ....
     
          start[1] = GetTickCount() ;  // Réinitialise le top départ #2
        }
     
     
        sleep(100) ;  // Laisser un peu de temps pour les autres processus
      } ;
      return 0 ;
    }
    J'avoue !!! J'ai pas testé le code, mais je pense que cela pourrais te suffire. A toi de voir.
    Nota : GetTickCount() retourne le nombre de millisecondes qui se sont écoulées depuis le début de la session courante de Windows.

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Elijha
    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
    #include <stdlib.h>
    #include <windows.h>
     
    #define MDELAI(S)  ((S)*60*1000)
    #define SDELAI(S)  ((S)*1000)
     
    DWORD start[2] ;
     
    int main(void)
    {
      start[0] = GetTickCount() ;  // Lecture du Nb de millisecondes
      start[1] = start[2] ;        // Même top départ
      while(1)
      {
        // Execute un code toute les 5 minutes
        if((GetTickCount()-start[0])>MDELAI(5))
        {
          // Ici ton code ....
     
          start[0] = GetTickCount() ;  // Réinitialise le top départ #1
        }
     
        // Execute un code toute les 33 secondes
        if((GetTickCount()-start[1])>SDELAI(33))
        {
          // Ici ton code ....
     
          start[1] = GetTickCount() ;  // Réinitialise le top départ #2
        }
     
     
        sleep(100) ;  // Laisser un peu de temps pour les autres processus
      } ;
      return 0 ;
    }
    Sauf qu'a la place du il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (GetMessage(&msg, NULL, 0, 0))
    Après à voir si tu traite d'abord l'événement lié au timer ou la transmission du message.

    Pour un sleep ? Il y a un ordonnanceur de processus pour ça (à moins que Windows ai besoin d'aide )

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Oh mon dieu mon dieu mon dieu...

    Mais pour l'amour de Cthulhu, LAISSEZ-LUI DIRE CE QU'IL EN EST POUR L'INSTANT!!


    PS: Attention, GetMessage() est une fonction bloquante.
    On peut avoir des trucs chouettes avec PeekMessage(), par contre.
    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
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Mouai, mais GetMessage(...) est bloquant, donc la temporisation, ici, ne sert plus à rien. Peut-être qu'avec PeekMessage(...) ?
    Voir l'article sur "Récupération des messages".
    Peut-être comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        // Execute un code toute les 5 minutes
        if((GetTickCount()-start[0])>MDELAI(5))
        {
          // Ici ton code ....
          if(PeekMessage(...))
          {
             // Actions à faire ....
          }
          start[0] = GetTickCount() ;  // Réinitialise le top départ #1
        }
    [Edit] Arff, coiffé au poteau par Médinoc [/Edit]

  10. #10
    Fabouney
    Invité(e)
    Par défaut
    merci pour vos réponse, je vais tester ta solution ce soir Elijha, et effet c'est justement la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (GetMessage(&msg, NULL, 0, 0))
    qui fait bugué la boucle principale, donc ton code m'a l'air pas mal Elijha, je vous tiens au courant.

    a ce soir, bye

  11. #11
    Fabouney
    Invité(e)
    Par défaut
    bon et bien merci Elijha, ton code est simple, je l'ai intégré dans mon programme et ma boucle, et cela fonctionne bien, merci bien !

Discussions similaires

  1. [Débutant] Problème avec Dev-Cpp 4.9.9.0
    Par P4Pi dans le forum Dev-C++
    Réponses: 7
    Dernier message: 16/01/2010, 16h48
  2. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 11h00
  3. [débutant] problème avec le curseur (sablier)
    Par bat dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/12/2004, 08h26
  4. [débutant] problème avec un "if"
    Par pingoui dans le forum Langage
    Réponses: 10
    Dernier message: 11/08/2004, 09h46
  5. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28

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