首先,你所問的問題是:當然你得到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'。 –