2014-02-28 54 views
-1

我寫一個簡單的程序(我的第一個程序)來顯示筆記本電腦的電池,但是,我想保持活躍監測電池%:C++:我怎樣才能保持我的程序(輸出控制檯)活着

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%! :(,我敢肯定這是不是這樣做的正確方法。

任何建議? 感謝

+0

每次檢查後都要睡眠10秒(或不管多長時間)。該進程在睡眠時不會使用CPU。 – Brian

+0

在循環中添加線程睡眠週期(延遲)。也可以使用'for(;;)'無限循環而不是'goto'。並且不返回1表示失敗,則從''返回'EXIT_FAILURE'。 –

回答

1

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

這樣做是打印在一行中的信息,然後搬回到該行的開頭,睡眠大約一然後寫下一行,覆蓋之前的內容。

如果您寫的新行比上一行更短,則可能會看到一些視覺工件。去除它們不應該很難,但我會把它留給你作爲練習。這裏有一個提示:如果你輸出一個字母曾經是的空間會發生什麼?

爲了跨線操作,您需要使用更高級的技術來操縱控制檯,而這個練習變得更加棘手。

1

你有100%的CPU使用率,因爲你的程序總是處於運行狀態。

我不不想進入細節,並考慮到這是你的第一個程序,我建議把一個呼叫usleepgoto之前。

,當然,避免goto,使用合適的循環來代替。

int milliseconds2wait = 3000; 

while (!flag_exit) { 
// code 
usleep(1000 * milliseconds2wait) 
} 

更新:這是窗戶,用Sleep代替usleep

Sleep(milliseconds2wait); 
2
while (true) { 
    // do the stuff 
    ::Sleep(2000); // suspend thread to 2 sec 
} 

(你是在Windows根據API函數)

見:Sleep

相關問題