2012-12-27 65 views
6

我有2個項目。一個是由C++ Builder構建的,沒有MFC風格。另一個是VC++ MFC 11.音頻關閉時線程很慢

當我創建一個線程並創建一個循環 - 比方說,這個循環將進度條位置添加一個 - 使用Sleep(10)從1增加到100它當然適用於C++ Builder和C++ MFC。

現在,Sleep(10)等待10毫秒。好。但問題是隻有打開媒體播放器,Winamp或其他任何能產生「聲音」的東西。如果我關閉了所有媒體播放器,winamp和其他聲音程序,我的線程就會慢於10毫秒。

需要像50-100 ms/each。如果我打開任何音樂,它會按我的預期正常工作。

我不知道爲什麼會發生這種情況。我首先想到我在MFC應用程序中犯了一個錯誤,但爲什麼C++ Builder也放慢速度?

是的,我確信它是有聲的,因爲我甚至重新合成了我的窗戶,禁用了一切。最後我發現了這個問題。

我的代碼需要什麼嗎?

更新

現在,我按照代碼,發現我在這些地區使用Sleep(1)等待1毫秒。原因是,我從左向右移動一個對象。如果我消除了這種睡眠,那麼移動不會顯示出來,因爲它非常快。所以,我應該使用Sleep(1)。與Sleep(1),如果音頻是比它的工作。如果音頻是off比它慢很多。

for (int i = 0; i <= 500; i++) { 
    theDialog->staticText->SetWindowsPosition(NULL, i, 20, 0, 0); 
    Sleep(1); 
} 

因此,關於該建議是非常讚賞。我該怎麼辦?

我知道這是不正確的方法。我應該使用其他適當和有效的東西。但究竟是什麼?哪個功能或類能幫助我將靜態文本從一個位置平滑移動到另一個位置?

此外,更改線程優先級沒有幫助。

更新2

更新1是另一個問題:)

+0

有趣。當您注意到差異時,您的流程的優先級是否仍然相同? – Brad

+1

過程的優先級是相同的。第二個有趣的是,如果我打開媒體播放器(但不播放音樂),我的線程程序以2%的CPU和線程工作運行。如果我關閉媒體播放器,立即減速並佔用CPU的0%。 – xangr

+2

這可能是由於處理器限制了CPU的頻率。 – johnathon

回答

4

睡眠(10),將(如我們所知),等待大約10毫秒。如果此時需要運行更高優先級的線程,線程喚醒可能會延遲。多媒體線程都處於實時或高優先級可能運行,這樣當你播放聲音,你的線程喚醒被延遲。

參考傑弗裏Richters評論中編寫應用程序的Microsoft Windows(第4版),第睡在第7章:

該系統使得線程調度不爲大約 數指定的毫秒。這是正確的 - 如果你告訴系統 你想休眠100毫秒,你將睡眠約 長,但可能幾秒鐘或更多分鐘。請記住, Windows不是實時操作系統。您的線程可能會在正確的時間醒來,但是否取決於系統中正在進行的其他操作。

另外,作爲每MSDN Multimedia Class Scheduler Service (Windows)

MMCSS 確保時間敏感的處理接收優先訪問CPU資源。

按照上述文件,還可以控制將保證低優先級任務,通過註冊表鍵

4

Sleep(10)等待至少 10毫秒。你必須編寫代碼來檢查你實際等待了多久,如果它超過10毫秒,請在你的代碼中處理它。 Windows不是實時操作系統。

+0

我相信他知道這一點。問題是對量子的大小有什麼如此大的影響,或者它只是隨機的機會。另外,根據「合理處理」這個問題是不可能的(例如音頻或視頻重放)。 – Voo

+0

@Voo是對的。我意識到這一點。在安裝IDE後,我會嘗試使用'SetSystemPowerState()'函數來解決這個問題。 – xangr

+0

@Voo:他正在更新進度條位置。明智地處理它實際上是微不足道的。 –

2

Sleep()定時的最小分辨率設定全系統與timeBeginPeriod() CPU資源的百分比和timeEndPeriod()。例如,傳遞timeBeginPeriod(1)將最小分辨率設置爲1毫秒。音頻程序可能會將分辨率設置爲1毫秒,並在完成後將其恢復到大於10毫秒的時間。我遇到了一個使用Sleep(1)的程序的問題,只有當XE2 IDE運行時才能正常工作,否則會睡12 ms。我在程序開始時直接設置timeBeginPeriod(1)來解決問題。

參見:http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624%28v=vs.85%29.aspx