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 :

Comment faire un usleep inférieur à 100000 micro secondes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Par défaut Comment faire un usleep inférieur à 100000 micro secondes
    Bonjour et merci d'avance pour votre aide.

    Je veux faire une pause de l'ordre de la milliseconde. Cependant, le niveau de précision atteind n'est pas bon dès que usleep est inférieur à 100000. Ne peut on pas faire un usleep(100); ?

    Precision correct :
    Quand je place boucle=50 et pause=100000, alors j'obtiens bien 5 secondes de pause pour usleep et idem pour nanosleep

    Précision incorrect :
    Quand je place boucle=500 et pause=10000, alors j'obtiens 10 secondes de pause pour usleep et 9 secondes pour nanosleep
    Quand je place boucle=5000 et pause=1000, alors j'obtiens 28 secondes de pause pour usleep et 20 secondes pour nanosleep


    Voici mon code de test :

    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
     
    	time_t t0;
    	struct tm * t0_structure;
    	unsigned long i;
    	unsigned long pause,boucle;
    	struct timespec req;
     
    boucle=500;	
    pause=10000;
     
    	req.tv_sec=0;
    	req.tv_nsec=1*1000*pause;
     
    	t0=time(0);
    	for (i=0;i<boucle;i++)
    		usleep(1*pause);
    	t0=time(0)-t0;
    	t0_structure=gmtime(&t0);
    	printf("\nTemps d'execution usleep : %d:%d:%d\n",t0_structure->tm_hour,t0_structure->tm_min,t0_structure->tm_sec);
     
    	t0=time(0);
    	for (i=0;i<boucle;i++)
    		nanosleep(&req,NULL);
    	t0=time(0)-t0;
    	t0_structure=gmtime(&t0);
    	printf("\nTemps d'execution nanosleep : %d:%d:%d\n",t0_structure->tm_hour,t0_structure->tm_min,t0_structure->tm_sec);
    Christophe

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    La solution est précisément d'utiliser nanosleep, qui offre une résolution égale ou meilleure à usleep comme précisé dans les pages de manuel correspondantes.

  3. #3
    Membre habitué
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Novembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Novembre 2016
    Messages : 11
    Par défaut
    Oui, mais dans mon code, je test usleep et nanosleep. Et les deux manque de précision et sont trop lent.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Par rapport à quoi ? Les deux ne font rien de plus que leur part des contrats décrits dans leurs man respectifs.

    Il est évident que plus la durée de « sommeil » requis est courte, moins l'impact des paramètres extérieurs (résolution d'horloge native, changements de contexte, interruptions, préemption par les autres processus..) est négligeable sur le résultat final.

    Si ça ne suffit pas à ton cas d'utilisation (je repose la question : quel est-il ?), il va falloir taper dans la documentation du processeur voire investir dans du matériel dédié.

  5. #5
    Membre chevronné
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Par défaut
    Je vais peut-être répondre à côté mais que donne la std ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::this_thread::sleep_for(std::chrono::microseconds(1));

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Nous sommes en C.

Discussions similaires

  1. Réponses: 8
    Dernier message: 08/04/2011, 23h07
  2. [VBA]comment faire un temps arret de quelques secondes
    Par megapacman dans le forum Général VBA
    Réponses: 3
    Dernier message: 16/05/2008, 11h54
  3. Réponses: 7
    Dernier message: 27/01/2008, 12h08
  4. Réponses: 2
    Dernier message: 27/04/2007, 18h29
  5. Comment faire un clear sur un beufferedImage toutes les x secondes!
    Par jlassiramzy dans le forum EDT/SwingWorker
    Réponses: 10
    Dernier message: 26/07/2006, 13h18

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