C#中的自动电池电量检查

时间:2013-08-13 21:03:21

标签: c# conditional-statements batterylevel

我正在使用C#进行语音识别程序,我编写了几行代码,当我说“电池电量”时会回复当前的电池电量。

if (e.Result.Text.ToLower() == "battery level")
{
System.Management.ManagementClass wmi = new System.Management.ManagementClass("Win32_Battery");
var allBatteries = wmi.GetInstances();
//String estimatedChargeRemaining = String.Empty;
int batteryLevel = 0;

foreach (var battery in allBatteries)
{
    batteryLevel = Convert.ToInt32(battery["EstimatedChargeRemaining"]);
}

if(batteryLevel < 25)       
   JARVIS.Speak("Warning, Battery level has dropped below 25%");
else //Guessing you want else
   JARVIS.Speak("The battery level is at: " + batteryLevel.ToString() + "%");
return;
}

只有当我说“电池电量”时才会发生这种情况,我希望它每隔15分钟自动检查一次电池电量,如果电池电量低于25%,则会自动通过语音向我报告:

if(batteryLevel < 25)       
   JARVIS.Speak("Warning, Battery level has dropped below 25%");

我猜我需要一个计时器,但除此之外我不知道。

感谢。

3 个答案:

答案 0 :(得分:1)

一个选项是System.Threading.Timer。相关部分是回调和间隔。

该页面提供了更多信息,但这决定了这是否是您的正确选择。一些亮点是:

  

System.Threading.Timer是一个简单,轻量级的计时器,它使用回调方法并由线程池线程提供服务。不建议将其与Windows窗体一起使用,因为它的回调不会发生在用户界面线程上。 System.Windows.Forms.Timer是与Windows窗体一起使用的更好选择。对于基于服务器的计时器功能,您可以考虑使用System.Timers.Timer,它会引发事件并具有其他功能。

  

只要您使用Timer,就必须保留对它的引用。与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收。定时器仍处于活动状态这一事实并不能阻止它被收集。

编辑:现在你已经说过你在WinForms中,你可以看到MSDN推荐System.Windows.Forms.Timer。该MSDN页面给出了一个例子。您会看到订阅Tick事件是您的回调,Interval是时间间隔(以毫秒为单位)。您想将其设置为您声明的15分钟,即1000 * 60 * 15或900000。

改编自MSDN示例:

    private static readonly Timer batteryCheckTimer = new Timer();

    // This is the method to run when the timer is raised. 
    private static void CheckBattery(Object sender, EventArgs myEventArgs)
    {
        ManagementClass wmi = new ManagementClass("Win32_Battery");
        var allBatteries = wmi.GetInstances();
        foreach (var battery in allBatteries)
        {
            int batteryLevel = Convert.ToInt32(battery["EstimatedChargeRemaining"]);
            if (batteryLevel < 25)
            {
                JARVIS.Speak("Warning, Battery level has dropped below 25%");
            }
        }
    }

    [STAThread]
    public static void Main()
    {
        // Start the application.
        Application.Run(new Form1());
        batteryCheckTimer.Tick += new EventHandler(CheckBattery);
        batteryCheckTimer.Interval = 900000;
        batteryCheckTimer.Start();
    }

答案 1 :(得分:1)

每15分钟一次循环调用将导致MainUI线程响应不佳,应用程序将崩溃。您可以使用线程来解决此问题。请查看以下代码片段,它将帮助您满足您的需求。您可以通过引用 System.Windows.Forms 命名空间而不是WMI查询来使用 SystemInformation 类。将Timer控制间隔设置为900000,每15分钟执行一次操作。如果有用,请标记答案

public delegate void DoAsync();

public void Main()
{
   timer1.Tick += new EventHandler(timer1_Tick);
   timer1.Interval = 900000;
   timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
   DoAsync async = new DoAsync(GetBatteryDetails);
   async.BeginInvoke(null, null);
}

public void GetBatteryDetails()
{
   int i = 0;
   PowerStatus ps = SystemInformation.PowerStatus;
   if (ps.BatteryLifePercent <= 25)
   {
      if (this.InvokeRequired)
          this.Invoke(new Action(() => JARVIS.Speak("Warning, Battery level has dropped below 25%");      
      else
          JARVIS.Speak("Warning, Battery level has dropped below 25%");
   }
   i++;
}

答案 2 :(得分:0)

正如McAden所说,可以使用计时器。可以在msdn website上找到计时器的示例。