首先,你所问的问题是:当然你得到10 0%CPU使用率,因为您要求计算机尽可能快地尝试获取并打印计算机的电源状态。而且,因为电脑会高兴地做你告诉他们的事情,那么......你知道接下来会发生什么。
正如其他人所说,该解决方案是使用会指示你的应用程序去睡觉的API。在Windows中,这似乎是您所选择的平台,该API是Sleep
:
// Sleep for around 1000 milliseconds - it may be slightly more since Windows
// is not a hard real-time operating system.
Sleep(1000);
其次,请不要使用goto
。 C中有循环结构,你应该使用它们。我没有从根本上反对goto
(事实上,在我的内核驱动程序编程日子里,我用它相当频繁),但我反对透视时,更好的替代品可供它使用。在这种情况下,更好的选择是while
循环。
在我告诉你之前,让我指出另一个问题:请勿使用system
函数。
为什么? system
函数执行传递给它的命令;在Windows上它发生到命令解释器(cmd.exe
)支持和内部命令调用cls
这恰好清除屏幕的上下文内执行。至少在您的系统。但你的并不是世界上唯一的系统。在一些其他的系统,有可能是一个项目叫做cls.exe
这将得到转而执行,谁知道会做什么?它可以清除屏幕,也可以格式化硬盘。所以请不要使用system
函数。这几乎总是做错事。如果你发现自己在寻找那个命令停下来,想想你正在做什么以及是否需要这样做。
因此,您可能会问,如果我不能使用system("cls")
,我该如何清除屏幕?有一个办法做到这一点,其应该是跨不同操作系统的便携:
int main(int, char **)
{
SYSTEM_POWER_STATUS spsPwr;
while (GetSystemPowerStatus(&spsPwr))
{
std::string status = "unknown";
if (spsPwr.ACLineStatus == 0)
status = "offline";
else if (spsPwr.ACLineStatus == 1)
status = "online";
// The percent of battery life left is returned as a value
// between 0 and 255 so we normalize it by multiplying it
// by 100.0 and dividing by 255.0 which is ~0.39.
std::cout << "Current Status: " << status << " ("
<< static_cast<int>(spsPwr.BatteryFlag) << "): "
<< 0.39 * static_cast<int>(spsPwr.BatteryLifePercent)
<< "% of battery remaining.\r" << std::flush;
// Sleep for around 1000 milliseconds - it may be slightly more
// since Windows is not a hard real-time operating system.
Sleep(1000);
}
// Print a new line before exiting.
std::cout << std::endl;
return 0;
}
这样做是打印在一行中的信息,然后搬回到该行的开头,睡眠大约一然后写下一行,覆盖之前的内容。
如果您写的新行比上一行更短,则可能会看到一些视觉工件。去除它们不应该很难,但我会把它留给你作为练习。这里有一个提示:如果你输出一个字母曾经是的空间会发生什么?
为了跨线操作,您需要使用更高级的技术来操纵控制台,而这个练习变得更加棘手。
每次检查后都要睡眠10秒(或不管多长时间)。该进程在睡眠时不会使用CPU。 – Brian
在循环中添加线程睡眠周期(延迟)。也可以使用'for(;;)'无限循环而不是'goto'。并且不返回1表示失败,则从''返回'EXIT_FAILURE'。 –