簡體   English   中英

C ++:如何使程序(輸出控制台)保持活動狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM