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

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、ミリ秒単位のティック間の時間であることがわかります。1000 * 60 * 15 または 900000 になる 15 分に設定します。

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 スレッドの応答が遅くなり、アプリケーションがクラッシュします。これは、Threading を使用して解決できます。あなたのニーズに役立つ以下のコードスニペットをチェックしてください。WMI クエリの代わりにSystem.Windows.Forms名前空間を参照することで、 SystemInformationクラスを使用できます。タイマー制御間隔を 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 に答える