7 votes

Utilisation de la fonction Sleep()

Il s'agit d'un exemple de pgm pour vérifier la fonctionnalité de la fonction Sleep(). il s'agit d'une démo seulement puisque j'utilise ces fonctions sleep() et clock() dans le développement de mon application.

  // TestTicks.cpp : Defines the entry point for the console application.
  //

  #include "stdafx.h"
  #include<iostream>
  #include<iomanip>
  #include <Windows.h>

  int _tmain(int argc, _TCHAR* argv[])
  {
    int i, i2;
    i = clock();
    //std::cout<<" \nTime before Sleep() : "<<i;
    Sleep(30000);
    i2 = clock();
    //std::cout<<" \nTime After Sleep() : "<<i2;
    std::cout<<"\n Diff : "<<i2 -i;
    getchar();
      return 0;
  }

Dans ce code, je calcule le temps en utilisant clock() avant et après la fonction sleep. Comme j'utilise sleep(30000), la différence de temps sera d'au moins 30000.

J'ai exécuté ce programme plusieurs fois et imprimé les sorties 30000, 30001, 30002. Ces valeurs sont correctes. Mais parfois, j'obtiens des valeurs comme 29999 et 29997. Comment est-ce possible, puisque j'ai mis 30000 sleep entre les clock().

Veuillez m'en donner la raison.

5voto

SirDarius Points 13074

Según http://msdn.microsoft.com/en-us/library/Windows/desktop/ms686298(v=vs.85).aspx :

L'horloge du système "tique" à un rythme constant. Si dwMilliseconds est inférieur à la résolution de l'horloge système, le thread peut dormir moins longtemps que la durée spécifiée. Si dwMilliseconds est supérieur à un tic mais inférieur à deux, l'attente peut être comprise entre un et deux tic, et ainsi de suite.

Cela signifie simplement que la fonction Sleep ne dormira jamais exactement pendant la durée indiquée, mais aussi près que possible compte tenu de la résolution de l'ordonnanceur.

La même page vous donne une méthode pour augmenter la résolution de la minuterie si vous en avez vraiment besoin.

Il existe également minuteries haute résolution qui pourraient mieux répondre à vos besoins.

3voto

manasij7479 Points 1555

À moins que vous n'utilisiez un système d'exploitation en temps réel, c'est tout à fait normal.

Le système d'exploitation doit programmer et exécuter de nombreux autres processus, de sorte que le réveil des vôtres peut ne pas correspondre à l'heure exacte à laquelle vous vouliez dormir.

1voto

Arno Points 2226

En clock() indique combien de temps de processeur le processus appelant a utilisé.

Vous pouvez remplacer l'utilisation de clock() par la fonction GetSystemTimeAsFileTime afin de mesurer l'heure avec plus de précision.

Vous pouvez également essayer d'utiliser période de début avec wPeriodMin renvoyé par un appel à timeGetDevCaps afin d'obtenir une fréquence d'interruption maximale.

Afin de synchroniser le sommeil avec la période d'interruption du système, je suggérerais également de d'avoir un sleep(1) avant la première "capture de temps".

En agissant ainsi, les "trop courts" disparaîtront.

Vous trouverez de plus amples informations sur le sommeil aquí

0voto

shabab alam Points 17
#include <iostream> 
#include <time.h>  

void wait(int seconds) 
{ 
    int endwait; 
    endwait = clock() + seconds * CLOCKS_PER_SEC ; 
    while (clock() < endwait){} 
} 

int main() 
{ 
    wait(2);
    cout<<"2 seconds have passed";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X