我的节目是幻灯片。它在具有其他进程的计算机上运行,因此当它等待显示下一张幻灯片时,我调用SleepEx(N,false),期望它将其使用的CPU量减少到接近零(N在100ms和5000ms之间)。在我的开发XP专业版机器上,正是在我的客户的XP Home机器上发生的事情,它在SleepEx()期间注册了30-80%的CPU。代码是一个单独的线程,因此无论使用所有cpu是在SleepEX()的调用内。有没有人见过这个?
答案 0 :(得分:1)
哪个进程占用了所有CPU?如果你使用调试器进入流程 - 堆栈跟踪中的哪个部分是花费时间?
尝试使用ProcDump在进程达到CPU峰值时创建进程转储。然后分析堆栈跟踪以查看它的卡住位置。这样做几次,你可以很好地抽样花时间。
答案 1 :(得分:0)
我之前见过这个。您阻止主窗口消息处理线程。
如果具有主窗口消息处理功能,则不应将Sleep()函数放在单线程应用程序中。窗口化应用程序总是应该处理窗口消息而没有明显的延迟,在另一种情况下,它将导致至少应用程序的死锁。 后果取决于Windows平台,编译器设置和CPU配置,通常在调试模式下的应用程序具有临时解决方法。但是如果你开始使用发布设置编译这样的应用程序,它可以使用一个带有函数的CPU核心,它已经阻止了他的主窗口消息处理线程。
MSDN Sleep()函数说明中的备注部分清楚地说明了这种情况。
你只需要新的线程,在那里使用Sleep()函数允许主线程中的窗口消息自由流动。