2010-11-09 3 views
0
void Wait(double Duration) 
{ 
    clock_t End; 
    End = clock() + (Duration*CLOCKS_PER_SEC); 

    while (clock() < End) 
    { 
     // This loop just stalls the program. 
    } 
} 

Ma fonction fonctionne parfaitement la moitié du temps, mais elle bloque occasionnellement le programme avant qu'il ne soit appelé. Par exemple, prenez l'extrait suivant:Pourquoi cette sortie attend-elle quelque chose après?

cout << "This is\n"; 
Wait(2.5) 
cout << "a test!"; 

Vous vous attendez la première ligne apparaisse immédiatement et la deuxième ligne apparaisse au bout de 2,5 secondes, mais parfois ALL apparaît au bout de 2,5 secondes. Quel est le problème?

+1

Il y a certainement une meilleure façon de faire ce que vous voulez vraiment faire. Faites-nous savoir votre plate-forme/compilateur, et nous pouvons donner de meilleurs conseils. –

+0

Est-ce que cela n'arrive que pour vous avec un cout? Gardez à l'esprit que c'est tamponné. Donc, si vous ne rougissez pas, je pense que vous pourriez avoir le comportement que vous éprouvez. – Bart

+0

Je ne sais pas si c'est correct, mais est-il possible que le compilateur optimise la boucle car il ne semble rien faire? Voir cette question: http://stackoverflow.com/questions/3592557/optimizing-away-a-while1-in-c0x – AshleysBrain

Répondre

4

essayer

cout.flush(); 

avant votre attente

2

Essayez cout << "This is" << endl;

Il ressemble à une mise en mémoire tampon, pas question d'horloge.

4

Cela pourrait être à cause de tampon E/S. Vous devez vider le tampon de sortie (essayez << endl au lieu de '\n' ou écrivez cout.flush) manuellement.

2

Le flush()/std :: endl a déjà été mentionné - mais avez-vous l'intention de consommer 100% d'un core en attendant? C'est ce que fait la boucle while()! Si vous voulez une plus belle approche "en attente", considérez une des opérations suivantes:

  1. boost :: :: fil sleep() - granularité milliseconde
  2. alarmes (1 seconde granularité)
  3. select()
  4. pthread_cond_timedwait()

etc.

Questions connexes