在SleepEx期间,CPU使用率不会下降

问题描述

| 我的程序是幻灯片。它在具有其他进程的计算机上运行,​​因此,在等待显示下一张幻灯片时,我将其称为SleepEx(N,false),期望它将使用的cpu数量减少到接近零(N在100ms和5000ms)。在我开发的XP Pro计算机上,确实如此,但是在客户的XP Home计算机上,它在SleepEx()期间注册了30-80%的cpu。该代码一个单线程,因此在调用SleepEX()时无论使用了什么cpu。有没有人见过这个?     

解决方法

哪个进程占用了所有CPU?如果您使用调试器进入该过程-在堆栈跟踪中花费的时间在哪里? 当进程达到该CPU峰值时,请尝试使用ProcDump创建该进程的转储。然后分析堆栈跟踪以查看其卡住的位置。多次执行此操作,就可以很好地了解其花费时间。     ,我以前看过您阻止主窗口消息处理线程。 如果它具有主窗口消息处理功能,则不应将Sleep()函数放在单线程应用程序中。窗口应用程序应始终处理窗口消息而没有明显的延迟,否则,它将至少对应用程序造成死锁。 后果取决于Windows平台,编译器设置和CPU配置,通常在调试模式下的应用程序具有临时解决方法。但是,如果您使用发行版设置启动此类应用程序,则该应用程序可能会消耗一个具有功能的CPU核心,从而阻塞了其主窗口消息处理线程。 MSDN Sleep()函数说明中的“备注”部分清楚地说明了这种情况。 您只需要创建新线程,即可在此处使用Sleep()函数以允许窗口消息在主线程中自由流动。