2011-05-23 80 views
1

我的程序是幻燈片放映。它在具有其他進程的機器上運行,所以在等待顯示下一張幻燈片時,我將其稱爲SleepEx(N,false),期望它使用的CPU數量接近於零(N在100ms和5000ms之間)。在我開發的XP Pro機器上,這正是發生的事情,但是在我的客戶的XP Home機器上,它在SleepEx()期間註冊了30-80%的CPU。該代碼是一個單線程,所以無論是使用所有的CPU都在調用SleepEX()。有沒有人見過這個?SleepEx()期間CPU使用率不下降()

+1

你稱之爲啓動線程的高級別,比如視頻播放器嗎? – 2011-05-23 10:13:03

+0

不知道。我使用FreeImage庫來處理圖像轉換,但在這一點上沒有理由做任何事情。事實上,它在我的機器上運行正常,但不在客戶身上令人困惑。 – 2011-05-23 10:16:38

+4

Offtopic:調用睡眠是一種奇怪的方式來做到這一點。當你這樣做時,你會使你的應用程序無響應。使用計時器觸發幻燈片更改會更好。 – 2011-05-23 11:01:36

回答

1

哪個進程佔用所有CPU?如果用調試器闖入進程 - 在堆棧跟蹤中花費時間?

嘗試使用ProcDump在進程達到CPU峯值時創建進程轉儲。然後分析堆棧跟蹤以查看它卡住的位置。這樣做幾次,你可以很好地抽出花費時間。

+0

這是過程本身。我正在使用任務管理器進行監控。 – 2011-05-23 10:22:17

+0

我建議你在繁忙時間觸發進程的遠程轉儲,並分析堆棧跟蹤以查看它花費的時間 – 2011-05-23 10:23:12

+0

對不起 - 過早地點擊。我沒有可用的調試器。 – 2011-05-23 10:23:44

0

我以前見過這個。您阻止主窗口消息處理線程。

如果它具有主窗口消息處理功能,則不應將Sleep()函數置於單線程應用程序中。窗口化的應用程序總是應該處理窗口消息而不會有明顯的延遲,另一種情況是它至少會導致應用程序出現死鎖。 結果取決於Windows平臺,編譯器設置和CPU配置,通常在調試模式下的應用程序具有臨時解決方法。但是,如果你啓動這樣的應用程序編譯與釋放設置它可以消耗一個CPU核心功能,這阻止了他的主窗口消息處理線程。

MSDN的備註部分Sleep()函數說明清楚地說明了這種情況。

你只需要開啓新的線程,在那裏使用Sleep()函數允許主線程中的窗口消息自由流動。