-3

在我的应用程序中,我使用了 OOP 的特性,如类、继承等。在一段时间后,我还没有在应用程序中使用任何线程,它需要 100% 的 CPU 周期。谁能帮我找出可能的原因是什么?

4

3 回答 3

2

最可能的原因是无限循环(正如 Jogojapan 已经提到的)。找出它的最佳方法是使用调试器并查看代码在开始使用高 CPU 时卡在哪里)..

于 2012-09-20T06:47:23.573 回答
1

除非您正在运行一些需要大量时间来完成非常复杂的“事情”的功能,否则它很可能是由某种没有暂停的循环引起的。寻找类似do {...} while (!exit);修复它的东西,您需要调用一个为操作系统产生时间的函数,并对该函数进行 API 调用,该sleep(x)函数有效地暂停您的程序“x”毫秒。如果您使用的是 Windows,这可以通过#include <windows.h>然后放在sleep(10);循环末尾来完成。“10”是任意的;但请注意,较小的值往往是随机的,如果您有很多图形(对于 30 fps),小于 33 的任何值都可以,而 100 左右对于主要涉及单击或菜单的事件驱动的事物来说是好的。

于 2012-09-20T07:01:04.640 回答
0

首先,100%的CPU使用率当然不一定是问题。如果进程执行大量计算,而不是例如 IO,则 100% 的 CPU 使用率可能是完全健康的,并且实际上是理想的。

但是,如果您确实觉得它正在使用 CPU 周期,虽然它不应该,这里有一些通用的策略来处理它:

  1. 首先编写不太可能导致此类问题的代码。使用单元测试(对输入范围有很好的覆盖),并避免退出条件过于复杂的循环。(对于简单或标准的情况,使用内置算法如std::for_eachstd::generate也有助于避免无限循环。)

  2. 使用日志消息,即使在几天后,您也可以通过检查日志来跟踪程序正在执行的操作。如果您担心大量日志消息会增加计算负担,您可以实现它们,以便有运行时甚至编​​译时选项来打开或关闭它们或选择详细程度。有各种日志框架可以提供帮助(甚至有一个SO question 列出了它们,尽管它已关闭并且可能会被删除)。

  3. 如果上述方法没有帮助,并且您遇到了与您的帖子中描述的情况类似的情况,请使用调试器来确定您的进程陷入的代码部分。您可以在调试器中运行该程序几天或几周,如果必要的。当它达到 100% CPU 使用率时,中断并检查调用堆栈以查看进程在哪里。无限循环(或类似现象)可能发生在相对较高的级别上,因此您可能需要在堆栈中上下走动以了解循环发生的位置。您也可以继续该过程并在稍后再次中断。

于 2012-09-20T07:59:51.810 回答