2011-05-14 480 views
4

我一直在研究斯坦福大學的CS106B課程,在完成Boggle任務時,我注意到Windows上的Sleep()函數與Pause()函數的行爲不同。出於測試目的,我只是簡單地設置了電路板並使用提供的gboggle.h文件突出顯示了Boggle多維數據集,然後刪除突出顯示。以下是相關的代碼:C++中的Pause(),Sleep()和Wait()之間的區別是什麼?

for(int row = 0; row < board.numRows(); row++) 
{ 
    for(int col = 0; col < board.numCols(); col++) 
    { 
     HighlightCube(row, col, true); 
    } 
} 

Pause(0.5); 

for(int row = 0; row < board.numRows(); row++) 
{ 
    for(int col = 0; col < board.numCols(); col++) 
    { 
     HighlightCube(row, col, false); 
    } 
} 

如果我使用Pause(),立方體突出顯示,然後恢復正常。如果我使用Sleep()或Wait(),則多維數據集永遠不會突出顯示,並且程序中的延遲發生在板被繪製之前,而不是在for循環之間。相關的Wait()函數:

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

取自here。我在Windows XP上使用Visual Studio 2005。

這些函數之間的區別是什麼導致它們以這種方式進行操作?

編輯:我知道睡眠和等待需要整數。我用整數測試了它們,看到了延遲,但它在方塊寫入之前發生。對不起,我以前不清楚。編輯2:在查看我使用過的其他一些庫後,我發現暫停實際上是圖形庫的一部分,它只是暫停圖形緩衝區。

+2

什麼暫停你想要?在win32 API中沒有稱爲暫停的功能。 – ronag 2011-05-14 22:55:30

+1

在C++中沒有叫'暫停','睡眠'或'等待'的函數。這些是特定於MS Windows的。所以我添加了關鍵詞來反映這個事實,現在我不必看這個問題。 :-) – Omnifarious 2011-05-14 23:01:03

+0

對於暫停命令,我在其他人的代碼中看到了它,對其進行了測試,並發現它的工作原理。 – acmshar 2011-05-15 01:44:51

回答

1

我從來沒有見過Pause命令;也許你可以爲它提供一些代碼?

Windows應用程序的工作原理是消息泵,並且繪畫是低優先級。

如果您在消息泵線程中休眠或等待,則會阻止它進一步處理消息,如繪製屏幕。

您需要屈服於消息泵,以便它可以完成工作。

您可能會看到使用Wait for multiple並運行第二個消息泵。 (猜測這是暫停的主體)。

+0

對於暫停命令,我在其他人的代碼中看到了它,對其進行了測試,並發現它的工作原理。 – acmshar 2011-05-15 01:06:09

5

睡眠想要一個整數毫秒,你給它0.5,所以你等待0毫秒。你的等待功能也需要整合,所以它有同樣的問題。

此外,您的等待功能被阻止。只要您在等待,您的應用程序就很忙,並使用CPU進行等待。而Windows睡眠函數暫停當前線程,這意味着你的應用程序真的什麼都不做(不使用任何CPU資源),直到時間結束。

編輯:我不知道什麼暫停,因爲它不是一個WinAPI函數。

編輯:它可能是,首先看到HighlightCube的結果,當應用程序返回到它的事件循環,然後繪製這些立方體。這樣,您只需突出顯示它們,然後等待,然後取消突出顯示它們。然後你的函數返回並且應用程序終於繪製它們。這很明顯,因爲睡眠(以及等待)只是阻止應用程序處理任何事件(包括窗口繪製事件)。我想暫停可以通過檢查事件循環來防止這種情況。其實這就是Greg Domjan已經寫過的。

+0

@acmshar想要的是'睡眠(500);'。 – 2011-05-14 22:54:26

+0

我編輯過,以澄清我確實使用適當的數字來進行等待和睡眠功能來查看結果。此外,我明白睡眠和等待都會阻止我的線程,但這並不能解釋爲什麼在突出顯示塊之前他們會停止它。也就是說,我不明白爲什麼線程在代碼中的等待或睡眠之前暫停。 – acmshar 2011-05-15 01:07:24

+0

不,等待並不會阻止你的線程(至少你等待)。你的線程繼續計算,只是一次又一次地調用clock()。雖然這不應該是你的問題的原因。 – 2011-05-15 01:14:01

0

由於wait接受一個int參數,使用0.5調用它(因爲你的例子使用Pause)將導致0.5被截斷爲0,所以你不會得到任何延遲。

相關問題