2013-07-24 15 views
4

Я разрабатываю программу, которая зависит от контроля уровня заряда аккумулятора компьютера.C#, Постоянно контролируйте уровень заряда батареи

Это C# код, я использую:

PowerStatus pw = SystemInformation.PowerStatus; 

    if (pw.BatteryLifeRemaining >= 75) 
    { 
     //Do stuff here 
    } 

Моя неудачная попытка из while заявления, он использует все CPU, который является нежелательным.

int i = 1; 
    while (i == 1) 
    { 
     if (pw.BatteryLifeRemaining >= 75) 
     { 
      //Do stuff here 
     } 
    } 

Как контролировать это постоянно с помощью бесконечного цикла, так что, когда он достигнет 75%, он выполнит некоторый код.

+1

Во-первых: используйте 'while (true)' вместо вашего времени, во-вторых, материал 'Do stuff here' может сломать ваш код, в то время как (true) не будет (конечно, если у вас где-то есть« break ») :) – wudzik

+0

Переместите монитор в другую нить. Forsee [обратный вызов gui] (http://msdn.microsoft.com/en-us/library/ms171728%28v=vs.80%29.aspx), чтобы обновить ваш графический интерфейс. – DarkBee

+0

Не было бы (хотя бы) создайте некоторый недостижимый код (как и я). @wud – Trontor

ответ

9

Try Таймер:

public class Monitoring 
{ 
    System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer(); 

    public Monitoring() 
    { 
     timer1.Interval = 1000; //Period of Tick 
     timer1.Tick += timer1_Tick; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     CheckBatteryStatus(); 
    } 
    private void CheckBatteryStatus() 
    { 
     PowerStatus pw = SystemInformation.PowerStatus; 

     if (pw.BatteryLifeRemaining >= 75) 
     { 
      //Do stuff here 
     } 
    } 
} 

UPDATE:

Существует еще один способ сделать ваша задача завершена. Вы можете использовать SystemEvents.PowerModeChanged. Назовите его и дождитесь изменений, следите за изменениями, которые произошли, а затем выполните свои действия.

static void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e) 
{ 
    if (e.Mode == Microsoft.Win32.PowerModes.StatusChange) 
    { 
     if (pw.BatteryLifeRemaining >= 75) 
     { 
      //Do stuff here 
     } 
    } 
} 

Check here for more.

+4

* Определенно * перейдите с методом «обновления». Постоянный опрос - это ужасный способ проверить срок службы батареи. Это своего рода поражение всей цели. Если бы это был я, я бы просто удалил первую часть ответа в целом. –

+0

что здесь pw? –

4

В то время как цикл будет вызывать ваш пользовательский интерфейс для ответа бедных и приложение будет получить разбился. Вы можете решить это, используя множество способов. Пожалуйста, ознакомьтесь с нижеприведенным фрагментом кода, который поможет вам в этом.

public delegate void DoAsync(); 

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

public void GetBatteryDetails() 
{ 
    int i = 0; 
    PowerStatus ps = SystemInformation.PowerStatus; 
    while (true) 
    { 
    if (this.InvokeRequired) 
     this.Invoke(new Action(() => this.Text = ps.BatteryLifePercent.ToString() + i.ToString())); 
    else 
     this.Text = ps.BatteryLifePercent.ToString() + i.ToString(); 

    i++; 
    } 
} 
+0

Красивый код там человек, работает безупречно! – Trontor

+0

@Trontor: Спасибо, друг :) –

2
BatteryChargeStatus.Text = SystemInformation.PowerStatus.BatteryChargeStatus.ToString(); 
BatteryFullLifetime.Text = SystemInformation.PowerStatus.BatteryFullLifetime.ToString(); 
BatteryLifePercent.Text = SystemInformation.PowerStatus.BatteryLifePercent.ToString(); 
BatteryLifeRemaining.Text = SystemInformation.PowerStatus.BatteryLifeRemaining.ToString(); 
PowerLineStatus.Text = SystemInformation.PowerStatus.PowerLineStatus.ToString(); 

Если вы хотите, чтобы выполнить некоторые операции просто преобразовать эти значения строки в целое число.

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

  • Нет связанных вопросов^_^