2011-05-23 76 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()函数允许主线程中的窗口消息自由流动。