我正在为我的笔记本制作一个Power Managment Monitor,我希望该程序只显示电源状态的每一个变化。所以,我做了一段时间(真实)循环,但(当然)它甚至显示了未改变的状态。 如果有人能告诉我如何让循环只显示电源状态的变化,我会非常感激!
我希望你能理解我的问题!
好吧,我试图比较旧值和新值,但它没有发生。这是代码:
using System;
using System.Windows.Forms;
using System.Threading;
namespace SimplePMMonitor
{
class PMMonitor
{
static void Main(string[] args)
{
Console.WriteLine("Simple Battery Monitor");
Console.WriteLine("<C> Copyright 2001 Circuit Design Corporation");
Console.WriteLine("<C> Copyright 2011 Simple Corporation");
Console.WriteLine("\nMonitoring started...\n");
PowerStatus pwr = SystemInformation.PowerStatus;
PowerStatus oldPwrStat = SystemInformation.PowerStatus;
DateTime currentDateTime = new DateTime();
currentDateTime = DateTime.Now;
bool initialStart = true;
while (true)
{
Thread.Sleep(1000);
if (pwr.BatteryLifePercent == oldPwrStat.BatteryLifePercent) continue;
if (!initialStart && Math.Abs((int)(pwr.BatteryLifePercent) - (int)(oldPwrStat.BatteryLifePercent)) > 1)
{
Console.WriteLine("=== Battery life has changed more than one percent ===");
}
initialStart = false;
Console.Write("{0} ", currentDateTime);
float remaining = pwr.BatteryLifePercent;
string chargeStatus = pwr.BatteryChargeStatus.ToString();
Console.Write("Battery status: {0}, {1}% ", chargeStatus, remaining * 100);
PowerLineStatus powerSource = pwr.PowerLineStatus;
switch (powerSource)
{
case PowerLineStatus.Offline: Console.WriteLine("Battery"); break;
case PowerLineStatus.Online: Console.WriteLine("AC"); break;
default: Console.WriteLine("Unknown"); break;
}
if (pwr.BatteryLifeRemaining != -1)
{
Console.WriteLine("Battery life remaining {0} ", pwr.BatteryLifeRemaining);
}
if (pwr.BatteryFullLifetime != -1)
{
Console.WriteLine("Batery full life remaining {0} ", pwr.BatteryFullLifetime);
}
}
}
}
}
但是当我执行它时没有任何反应。这是一张照片:http://img830.imageshack.us/i/88197124.jpg/
它保持这样,即使我拔下/插上充电器电缆,它也不会改变。
P.S:对不好的代码感到抱歉......
答案 0 :(得分:3)
我相信您可以订阅一些系统事件或收听一些Windows消息,所以实际上您不需要一段时间的方法,您可以简单地运行代码,每当电源状态发生变化时,您都会收到通知并执行一些特定的代码。看看这里:http://msdn.microsoft.com/en-us/library/aa373163
答案 1 :(得分:1)
如何使用定时器每隔几秒检查一次更改?
在计时器事件中,您获得新值,与旧值进行比较,然后如果它们不同,则执行您希望在更改时发生的任何事情。
看起来像SystemInformation.PowerStatus
总是返回相同的实例。因此,您需要备份各个属性,而不能整体备份pwr
。
PowerStatus oldPwrStat = pwr;
while (true)
{
Thread.Sleep(1000);
oldBatteryLife=newBatteryLife;
newBatteryLife=BatteryLifePercent;
...
}
continue
如果电池寿命没有改变也很糟糕。如果电池寿命没有改变,则根本不检查任何其他属性。
每次迭代循环时,您还应该只读取一次属性。否则它可能会在一次迭代中发生变化而你会遇到奇怪的错误。
答案 2 :(得分:0)
首先,确保在循环中放置Sleep
,否则您将完成耗尽电池(程序将使用100%CPU来检查电池状态)。
要仅显示更改,请存储旧值。仅当新值不等于旧值时,才显示更改。