2010-06-04 4 views
3

Ok, c'est juste par curiosité, mais pourquoi la fonction sleep ne fonctionne PAS en boucle, ou comment puis-je la faire fonctionner en boucle?C++, sleep, et loops

for(int i = 0; i < 5; i++) { 
    cout << i << endl; 
    sleep(2); 
} 
+1

Ummm ... qu'est-ce qui vous fait penser que ça ne marche pas? –

+0

peut-être, son "stockage" ces dort, et, est l'exemple ci-dessus, imprimera 0 1 2 3 4 après 10 secondes est en hausse? Si c'est le cas, comment puis-je éviter cela? –

+0

On dirait que ça devrait marcher pour moi ... À moins bien sûr que le sommeil soit la fonction standard et que vous ayez écrit le vôtre. –

Répondre

6

cout est tamponnées, ce qui signifie son contenu ne sont pas toujours sur la console tout de suite. Essayez d'ajouter cout.flush() juste avant sleep(2);

+0

ahhh, intéressant. –

+26

<< endl vide réellement le flux. Il a le même effet que << "\ n" << flush. –

+0

Ou vous pouvez utiliser std :: ends pour faire la même chose sans le retour à la ligne. – Konrad

2

Si cela ne fonctionne pas pour vous, vous pouvez essayer ce code:

#include <iostream> 
#include <windows.h> 

... 

for(int i = 0; i < 5; i++) { 
    cout << i << endl; 
    Sleep(2000); 
} 
+6

compte tenu de l'étiquette de linux sur la question, je suppose que l'inclusion n'est pas une option – BenG

0

À mon humble avis, ce programme devrait fonctionner correctement. Peut-être que votre std :: cout est redirigé ailleurs? Vous n'appelez pas la fonction sleep() correcte (mais pas d'en-tête fourni)? Ou autre problème? Mais ça devrait marcher.

0

Avez-vous essayé de dérouler la boucle pour voir si elle se comporte de la même manière?

cout << 1 << endl; 
sleep(2); 
cout << 2 << endl; 
sleep(2); 
// Etc. 

En supposant que se comporte de la même façon, même si std :: endl est censé vider le tampon, il ressemble vraiment à dave.kilian a la bonne idée que Cout ne se rincer jusqu'à ce que le programme (probablement) se termine.

Dans ce cas, essayez de faire le std :: flush et voyez si cela aide - il est possible que vous ayez un bug (fonctionnalité manquée?) Dans votre bibliothèque standard.

Une autre chose à essayer est de rediriger la sortie vers un fichier tout en le regardant avec tail -f dans une autre fenêtre. Voir si le même délai se produit lors de la redirection.

Enfin, essayez de jouer avec le niveau d'optimisation du compilateur et voyez si cela change les résultats.

-1

Essayez Sleep() au lieu du sommeil()

0

Dave vous a déjà donné la réponse, je ne vais pas toucher à ce sujet. Cependant, si c'est purement pour le débogage ou le code du prototype, vous pouvez aussi diriger la sortie vers le frère/la sœur de std :: cout, std :: cerr, qui n'est pas tamponné pour commencer. Cela signifie que vous n'avez pas besoin d'appeler explicitement flush et vous n'avez pas besoin d'ajouter un endl à votre sortie.