循环,连续变化; C#

时间:2011-02-27 18:43:03

标签: c#

我正在为我的笔记本制作一个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:对不好的代码感到抱歉......

3 个答案:

答案 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来检查电池状态)。

要仅显示更改,请存储旧值。仅当新值不等于旧值时,才显示更改。