2013-07-24 139 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)'而不是你的while,其次''在这里做东西'的东西可以打破你的代码,而(真正的)不会(当然,如果你有'break'的地方:) :) – wudzik

+0

将显示器移至其他线程。 Forsee [gui的回调](http://msdn.microsoft.com/en-us/library/ms171728%28v=vs.80%29.aspx)更新您的GUI – DarkBee

+0

While(true)创建一些不可达的代码(就像我一样)。 @wud – Trontor

回答

9

尝试计时器:

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

这里是什么? –

4

While循环会导致你的用户界面反应差,应用程序将得到坠毁。你可以用很多方法解决这个问题。请检查下面的代码片段将有助于您的需求。

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(); 

如果要执行一些操作只是这些字符串值转换为整数。