Winapi CPU使用率不低于';在SleepEx()期间不要摔倒

Winapi CPU使用率不低于';在SleepEx()期间不要摔倒,winapi,Winapi,我的节目是幻灯片。它在有其他进程的机器上运行,因此当它等待显示下一张幻灯片时,我称之为SleepEx(N,false),期望它将使用的CPU量减少到接近零(N在100ms到5000ms之间)。在我的开发XP Pro机器上,情况正是如此,但在我客户的XP家用机器上,它在SleepEx()期间注册了30-80%的CPU。该代码是一个单线程,因此使用所有cpu的内容都在对SleepEX()的调用中。以前有人见过吗?哪个进程占用了所有CPU?如果您使用调试器闯入流程-它在堆栈跟踪中的什么位置花费时间 当

我的节目是幻灯片。它在有其他进程的机器上运行,因此当它等待显示下一张幻灯片时,我称之为SleepEx(N,false),期望它将使用的CPU量减少到接近零(N在100ms到5000ms之间)。在我的开发XP Pro机器上,情况正是如此,但在我客户的XP家用机器上,它在SleepEx()期间注册了30-80%的CPU。该代码是一个单线程,因此使用所有cpu的内容都在对SleepEX()的调用中。以前有人见过吗?

哪个进程占用了所有CPU?如果您使用调试器闯入流程-它在堆栈跟踪中的什么位置花费时间


当进程达到CPU峰值时,尝试使用创建进程转储。然后分析堆栈跟踪以查看它被卡住的位置。这样做几次,您就可以很好地了解它在哪里花费时间。

哪个进程占用了所有CPU?如果您使用调试器闯入流程-它在堆栈跟踪中的什么位置花费时间


当进程达到CPU峰值时,尝试使用创建进程转储。然后分析堆栈跟踪以查看它被卡住的位置。这样做几次,你就可以很好地了解它在哪里花费时间。

我以前见过这种情况。阻止主窗口消息处理线程

若单线程应用程序具有主窗口消息处理功能,则不应将Sleep()函数放在该应用程序中。窗口化的应用程序总是应该在没有明显延迟的情况下处理窗口消息,在另一种情况下,它至少会导致应用程序死锁。 结果取决于windows平台、编译器设置和CPU配置,通常处于调试模式的应用程序有临时解决方法。但是,如果您启动使用发布设置编译的应用程序,它可能会消耗一个CPU内核的函数,这会阻塞他的主窗口消息处理线程

MSDN Sleep()函数说明中的备注部分清楚地说明了这种情况


您只需启动新线程,就可以在主线程中使用Sleep()函数来允许窗口消息自由流动。

我以前见过这种情况。阻止主窗口消息处理线程

若单线程应用程序具有主窗口消息处理功能,则不应将Sleep()函数放在该应用程序中。窗口化的应用程序总是应该在没有明显延迟的情况下处理窗口消息,在另一种情况下,它至少会导致应用程序死锁。 结果取决于windows平台、编译器设置和CPU配置,通常处于调试模式的应用程序有临时解决方法。但是,如果您启动使用发布设置编译的应用程序,它可能会消耗一个CPU内核的函数,这会阻塞他的主窗口消息处理线程

MSDN Sleep()函数说明中的备注部分清楚地说明了这种情况


您只需启动新线程,就可以在主线程中使用Sleep()函数来允许窗口消息的自由流动。

您是否调用启动线程的高级功能,例如视频播放器?并非有意。我使用FreeImage库来处理图像转换,但目前没有理由这样做。它在我的机器上正常工作,但在客户的机器上却不正常,这一事实令人费解。离题:呼叫睡眠是一种奇怪的方式。当你这样做时,你会使你的应用程序无响应。最好使用计时器来触发幻灯片更改。您是否调用启动线程的高级功能,例如视频播放器?并非有意。我使用FreeImage库来处理图像转换,但目前没有理由这样做。它在我的机器上正常工作,但在客户的机器上却不正常,这一事实令人费解。离题:呼叫睡眠是一种奇怪的方式。当你这样做时,你会使你的应用程序无响应。最好使用计时器来触发幻灯片更改。我建议您在这段繁忙时间触发进程的远程转储,并分析堆栈跟踪,查看它在哪里花费时间或过早命中。我没有可用的调试器。我做了一个ProcDump,现在有1.5Mb的转储文件,但不知道应该用什么来分析它。CPU为59%,转储在屏幕刷新后约5秒(下一次刷新到期前35秒)进行。这是您应该了解的内容。一个非常强大的调试工具。基本上,你应该能够把这个转储文件放到VisualC++或WrnBG中,然后看到堆栈跟踪(就像你碰到断点)。谢谢你的帮助,但是我不确定我能理解这是怎么回事。我知道程序正在执行SleepEx(),并且我知道在SleepEx()处于活动状态时出现高CPU,因为SleepEx()之后的命令没有立即执行。看来你要我调试API调用了。我建议您在这段繁忙时间触发进程的远程转储,并分析堆栈跟踪,以查看它在哪里花费时间或过早命中。我没有可用的调试器。我做了一个ProcDump,现在有1.5Mb的转储文件,但不知道应该用什么来分析它。CPU为59%,转储在屏幕刷新后约5秒(下一次刷新到期前35秒)进行。这是您应该了解的内容。一个非常强大的调试工具。基本上,你应该能够把这个转储文件放到VisualC++或WrnBG中,然后看到堆栈跟踪(就像你碰到断点)。谢谢你的帮助,但是我不确定我能理解这是怎么回事。我知道程序正在执行SleepEx(),并且我知道在SleepEx()处于活动状态时出现高CPU,因为SleepEx()之后的命令没有立即执行。看来你要我调试API调用了。或者我是穆桑德斯托?