[英]C++: How Can I keep my program (output console) alive
我正在編寫一個簡單的程序(我的第一個程序)來顯示筆記本電腦的電池,但是,我想保持其活動狀態以監視電池百分比。:
using namespace std;
int main(int argc, char *argv[]) {
id:
SYSTEM_POWER_STATUS spsPwr;
if (GetSystemPowerStatus(&spsPwr)) {
cout << "\nAC Status : " << static_cast<double>(spsPwr.ACLineStatus)
<< "\nBattery Status : " << static_cast<double>(spsPwr.BatteryFlag)
<< "\nBattery Life % : " << static_cast<double>(spsPwr.BatteryLifePercent)
<< endl;
system("CLS");
goto id;
return 0;
}
else return 1;
}
使用goto似乎是個壞主意,因為CPU利用率躍升至99%! :(,我確信這不是正確的方法。
有什么建議嗎? 謝謝
while (true) {
// do the stuff
::Sleep(2000); // suspend thread to 2 sec
}
(根據API函數,您在Windows上)
請參閱: 睡眠
因為程序始終在運行,所以您有100%的CPU使用率。
我不想詳細介紹,並且鑒於這是您的第一個程序,所以我建議在goto
之前調用usleep
。
並且,當然,請避免使用goto
,而是使用適當的循環。
int milliseconds2wait = 3000;
while (!flag_exit) {
// code
usleep( 1000 * milliseconds2wait )
}
更新:這是Windows,使用Sleep
而不是usleep
:
Sleep( milliseconds2wait );
首先,您要問的問題:當然,您要獲得100%的CPU使用率,因為您要讓計算機嘗試盡快獲取並打印計算機的電源狀態。 而且由於計算機將很高興地執行您告訴計算機的操作,所以...您知道接下來會發生什么。
正如其他人所說,解決方案是使用一個API,該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
,該命令恰好可以清除屏幕。 至少在您的系統上。 但是您並不是世界上唯一的系統。 在其他系統上,可能存在一個名為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;
}
這樣做是在一行中打印信息,然后移回該行的開頭,睡眠一秒鍾左右,然后寫入下一行,覆蓋以前的內容。
如果您編寫的新行比前一行短,則可能會看到一些視覺瑕疵。 刪除它們應該並不困難,但我將作為練習留給您。 這里有個提示:如果輸出一個空格,以前是字母會發生什么?
為了跨行執行此操作,您將需要使用更高級的技術來操縱控制台,並且此練習變得非常棘手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.