0

我正在用 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%");

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

谢谢。

4

3 回答 3

1

一种选择是System.Threading.Timer。相关的部分是回调和间隔。

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

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

只要您使用 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();
    }
于 2013-08-13T21:12:01.117 回答
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++;
}
于 2013-08-13T21:51:40.927 回答
0

正如 McAden 所说,可以使用计时器。可以在msdn 网站上找到一个计时器示例。

于 2013-08-13T21:36:49.663 回答