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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Qu'est-ce que ta "boucle principale" ?

  3. #3
    Membre Expert

    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
    Points : 5 723
    Points
    5 723
    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 à l'essai
    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
    Points : 14
    Points
    14
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    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" ?

  6. #6
    Membre éclairé
    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 : 55
    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
    Points : 742
    Points
    742
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    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.

  9. #9
    Membre éclairé
    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 : 55
    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
    Points : 742
    Points
    742
    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, 17h48
  2. [Débutant]Problème avec les timers
    Par mickael777 dans le forum MFC
    Réponses: 1
    Dernier message: 11/04/2005, 12h00
  3. [débutant] problème avec le curseur (sablier)
    Par bat dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/12/2004, 09h26
  4. [débutant] problème avec un "if"
    Par pingoui dans le forum Langage
    Réponses: 10
    Dernier message: 11/08/2004, 10h46
  5. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 16h28

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