2013-08-13 3 views
0

Я работаю над программой распознавания речи на C#, и я составил несколько строк кода, которые говорят о текущем уровне заряда батареи, когда я говорю «уровень заряда батареи».Автоматическая проверка уровня заряда аккумулятора на 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%"); 

Я предполагаю, что мне потребуется таймер, но кроме этого я понятия не имею.

Спасибо.

+0

Какая платформа? WPF/Winforms/etc ... – tnw

+0

О, его Winforms. –

ответ

1

Один из вариантов: System.Threading.Timer. Соответствующими частями являются обратный вызов и интервал.

С этой страницы больше информации, хотя это диктует, является ли это правильным выбором для вас. Некоторые основные моменты:

System.Threading.Timer - простой, легкий таймер, который использует методы обратного вызова и обслуживается потоками пула потоков. Он не рекомендуется использовать с Windows Forms, поскольку его обратные вызовы не встречаются в потоке пользовательского интерфейса. System.Windows.Forms.Timer - лучший выбор для использования с Windows Forms. Для серверной функции таймера вы можете использовать System.Timers.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(); 
    } 
+0

Я начинаю на C#. Не могли бы вы привести пример или что-то еще? Благодарю. Я использую Windows Forms. –

+0

Отредактировано, чтобы указать на таймер WinForms – McAden

+0

Итак, приведенный вами пример автоматически говорит «Предупреждение, уровень заряда батареи упал ниже 25%», если батарея упала ниже 25%? –

0

Как сказал McAden, таймеры могут быть использованы. Пример таймера можно найти на msdn website.

1

Loop-call каждые 15 минут приведет к тому, что поток MainUI будет плохой, и приложение будет разбито. Вы можете решить эту проблему, используя Threading. Пожалуйста, ознакомьтесь с приведенным ниже фрагментом кода, который поможет вашим потребностям. Вы можете использовать класс SystemInformation путем обращения пространства имен System.Windows.Forms вместо запроса WMI. Установите интервал управления таймером на 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++; 
} 
+0

. Он имеет «timer1» "подчеркнуто с помощью" Ссылка на объект требуется для поля, метода или свойства нестатического метода ". Тем не менее, у меня уже есть объект с именем timer1. –

+0

@Tahmid: Удалено Статическое ключевое слово из метода «Главная» будет работать. См. Обновленный ответ. У меня есть еще одно предложение. Попробуйте использовать System.Speech insteda Jarvis.Speek –

Смежные вопросы