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 :

utilisation d'un timer avec les pthreads


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 22
    Par défaut utilisation d'un timer avec les pthreads
    bonjour j'ai une petite question sur les pthread, mon pb est le suivant
    j'ai un main dans le quel je devrais programmer deux threads, un qui envoie des messages toute les 20 seconde et un autre toutes les 30 secondes
    svp pouvez vous me dire comment faire, pour programmer la periodicité .... car je pense que sleep ne marche pas ... acr elle va mettre tout les deux thread en attente !!!!!

    merci bcp

  2. #2
    Membre confirmé
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Par défaut
    Si tu crées 2 threads avec chacun une fonction sleep ça devrait fonctionner non?

  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
    Tu peux aussi utiliser la fonctio alarm ou signal ?

  4. #4
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    salut,

    la solution la plus banale pour moi, c'est d'utiliser une boucle while qui calcule le temps passé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    time_t old = time(NULL);
    while(send==false)
    {
    time_t current = time(NULL);
    if((current - old) > TIME_OF_THREAD))
    {
    send = true;
    }
    }
    je pense qu'il aura une petite defferences pour temps volu, mais sa sera de l'orde des MicroSecondes, et je pense pas que ca aura un effet sur ton travail ...

  5. #5
    Membre confirmé
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Par défaut
    Faire tourner le processeur à fond c'est pas forcément une bonne idée.

  6. #6
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Faire tourner le processeur à fond c'est pas forcément une bonne idée.
    oui, c'est vrai, mais c'est une solution envisageable !!!

    on peut utilise la fonction sleep(); normalement sa doit affecter le thread d'appel seulement.

    Par contre, signale(), ne sera pas d'une grande utilité

  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    j'ai un main dans le quel je devrais programmer deux threads, un qui envoie des messages toute les 20 seconde et un autre toutes les 30 secondes
    svp pouvez vous me dire comment faire, pour programmer la periodicité
    Ce que propose le PO me semble convenir. Le "sleep" impactera seulement le thread concerné. Etant donné la précision de windows (du moins si c'est l'OS en question) et vu le temps de périodicité élevé (20-30s), il n'y aura pas de soucis de précision.

    la solution la plus banale pour moi, c'est d'utiliser une boucle while qui calcule le temps passé :
    Utiliser du temps processeur inutilement n'est pas à envisager. "Sleep" est très bien ici puisqu'il endormira le thread jusqu'à la fin du temps prévu et permet ainsi aux autres threads de s'exécuter sans commutation de tâche inutile.


  8. #8
    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
    Je ferais autre chose.

    Je mettrais en place 2 alarmes (1 de 20s et 1 de 30s) et 2 threads.

    Les alarmes sont chargées de réveiller les threads en leur envoyant un signal qui eux sont bloqués avec la primitive correspondante.

    C'est une alternative au sleep.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    la solution la plus banale pour moi, c'est d'utiliser une boucle while qui calcule le temps passé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    time_t old = time (NULL);
    while (send == false)
    {
       time_t current = time (NULL);
       if ((current - old) > TIME_OF_THREAD)
       {
          send = true;
       }
    }
    Horrible. Une boucle sans suspension. Regarde la consommation CPU...

    (ton code en vrac, une fois passé à l'indenteur révèle une ) en trop...)

    De plus, c'est une méthode un peu lourdingue... Il est beaucoup plus rationnel de faire :
    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
     
    #include <stdio.h>
    #include <time.h>
     
    #ifdef WIN32
    #include <windows.h>
    #define msleep(ms) Sleep (ms)
    #else
    #include <unistd.h>
    #define msleep(ms) usleep ((ms)*1000)
    #endif
     
    /* 1 seconde */
    #define TIME_OF_THREAD 1
     
    int main (void)
    {
       time_t echeance = time (NULL) + TIME_OF_THREAD;
       int i = 0;
       while (i < 3)
       {
          time_t now = time (NULL);
          if (now >= echeance)
          {
             echeance = now + TIME_OF_THREAD;
             i++;
             printf ("TIC %d\n", i);
          }
          msleep (10);
       }
       return 0;
    }

Discussions similaires

  1. Utilisation d'un progressBar avec les Evénements
    Par Jitoubi dans le forum VB.NET
    Réponses: 7
    Dernier message: 10/03/2010, 15h35
  2. Réponses: 16
    Dernier message: 07/07/2009, 13h46
  3. Utilisation du tag target avec les iFrame
    Par Coulon Arnaud dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/08/2007, 12h35
  4. Réponses: 1
    Dernier message: 11/12/2006, 18h33
  5. PB sortie standard avec les PTHREAD !!!
    Par djspit dans le forum C++
    Réponses: 15
    Dernier message: 19/11/2004, 01h17

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