2014-02-28 34 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

相关问题