在我的应用程序中,我使用了OOP的功能,如类,继承等。 在一段时间后,我还没有在应用程序中使用任何线程,它需要100%的CPU周期。 任何人都可以帮我找出可能的原因是什么?
答案 0 :(得分:2)
最可能的原因是无限循环(正如Jogojapan已经提到的那样)。找到它的最好方法是使用调试器,并在开始使用高CPU时查看代码被卡住的位置。)
答案 1 :(得分:1)
除非你正在运行一些需要花费大量时间来做一件非常复杂的“事情”的功能,否则它可能是由某种没有暂停的循环引起的。寻找像do {...} while (!exit);
这样的东西来修复它,你需要调用一个能够为os产生时间的函数,并对sleep(x)
函数进行API调用,这会有效地暂停你的程序'x '毫秒。如果你正在使用Windows,可以通过#include <windows.h>
完成,然后将sleep(10);
放在循环的末尾。 '10'是任意的;但请注意,较小的值往往是随机的,如果你有很多图形(30 fps),任何小于33的东西都是好的,100左右对于主要涉及点击或菜单的事件驱动的东西是好的。
答案 2 :(得分:0)
首先,100%的CPU使用率当然不一定是个问题。如果该过程执行大量计算,而不是例如IO,100%的CPU使用率可能非常健康,实际上也是需要的。
但是,如果确实你觉得它正在使用CPU周期,虽然它不应该,这里有几个一般的策略来处理:
首先编写不太可能导致此类问题的代码。使用单元测试(具有良好的输入范围覆盖率),并避免出现过于复杂的退出条件。 (对于简单或标准情况,使用std::for_each
,std::generate
等内置算法也有助于避免无限循环。)
使用日志消息,以便您可以通过查看日志来跟踪您的程序正在执行的操作,即使在几天后也是如此。如果您担心由大量日志消息引起的额外计算负担,您可以实现它们,以便有运行时,甚至编译时选项来打开或关闭它们或选择详细程度。有各种日志框架可以提供帮助(甚至有一个SO question listing them,虽然它已关闭并可能被删除)。
如果以上内容没有帮助,并且您的情况与帖子中描述的情况类似,请使用调试器确定您的进程陷入的代码部分。您可以在调试器中运行该程序如有必要,可持续数天或数周。当它达到100%CPU使用率时,中断并检查callstack以查看进程的位置。无限循环(或类似现象)可能在相对较高的级别上发生,因此您可能需要在堆栈中上下移动以了解循环发生的位置。您也可以继续该过程并在以后再次中断。