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

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

我的函數在一半時間內完美運行,但偶爾會在程序調用之前暫停程序。例如,拿下面的代碼片段:爲什麼這個輸出在等待之後呢?

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

你所期望的第一線,立即出現第二行到2.5秒後出現,但它2.5秒後有時會出現所有。這是怎麼回事?

+1

有幾乎可以肯定是一個更好的方式做你真正想做的事情。讓我們知道您的平臺/編譯器,我們可以給出更好的建議。 – 2010-11-09 18:50:59

+0

這隻會發生在你身上嗎?請記住它是緩衝的。所以如果你不沖洗,我想你可能會得到你所遇到的行爲。 – Bart 2010-11-09 18:51:55

+0

我不確定這是否正確,但編譯器是否有可能優化掉循環,因爲它看起來沒有做任何事情?看到這個問題:http://stackoverflow.com/questions/3592557/optimizing-away-a-while1-in-c0x – AshleysBrain 2010-11-09 18:57:42

回答

4

嘗試

cout.flush(); 

你的等待

2

嘗試cout << "This is" << endl;

它看起來像一個緩衝,而不是時鐘問題。

4

這可能是因爲I/O緩衝之前。 您應該手動刷新輸出緩衝區(嘗試使用<< endl而不是'\n'或編寫cout.flush)。

2

flush()/ std :: endl已經被提及 - 但是您打算在等待時真正消耗一個核心的100%嗎?這就是while()循環所做的!如果你想有一個更好的方法來 「等待」,考慮下列之一:

  1. 的boost ::螺紋::睡眠() - 毫秒粒度
  2. 警報(1秒的粒度)
  3. 選擇()
  4. 那麼pthread_cond_timedwait()