我正在尝试将CPU使用情况更新到线程的进度条上。
我在这里的代码是:
private static int _cpuUsage;
protected PerformanceCounter cpuCounter;
private Thread thread;
public CPUUsageIndModel()
{
cpuCounter = new PerformanceCounter
{CategoryName = "Processor", CounterName = "% Processor Time", InstanceName = "_Total"};
thread = new Thread(GetCurrentCpuUsage);
thread.Start();
}
public void GetCurrentCpuUsage()
{
while (true)
{
_cpuUsage = Convert.ToInt32(Math.Round(cpuCounter.NextValue()));
Thread.Sleep(1000);
}
}
public int GetCPUUsage
{
get { return _cpuUsage; }
set
{
_cpuUsage = value;
NotifyPropertyChanged("_cpuUsage");
}
}
现在问题是我尝试用以下方式启动线程:
public void GetCurrentCpuUsage()
{
_cpuUsage = 40;
}
它工作正常,因此使cpuCounter
和循环使用。
任何人都可以指出我可能犯过的任何错误。
由于
编辑 - 完整课程和一些小调整:
public class CPUUsageIndModel : INotifyPropertyChanged
{
public static int _cpuUsage;
protected PerformanceCounter cpuCounter;
private Thread thread;
public CPUUsageIndModel()
{
cpuCounter = new PerformanceCounter
{CategoryName = "Processor", CounterName = "% Processor Time", InstanceName = "_Total"};
thread = new Thread(GetCurrentCpuUsage);
thread.Start();
}
public void GetCurrentCpuUsage()
{
while (true)
{
CPUUsage = Convert.ToInt32(Math.Round(cpuCounter.NextValue()));
Thread.Sleep(1000);
}
}
public int CPUUsage
{
get { return _cpuUsage; }
set
{
_cpuUsage = value;
NotifyPropertyChanged("_cpuUsage");
}
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
#endregion
}
答案 0 :(得分:1)
您需要通知WPF运行时更改。为此,您实现了INotifyPropertyChanged
接口。
你似乎在这里尝试,但你没有以正确的方式做到(你没有显示所有相关的代码,但我相当确定你的实现是不正确的。)
你需要: 1.绑定到公共财产(我们在您粘贴的代码中看不到这一点) 2.如果值已更改,则从属性的setter发送通知 3.通过属性设置器
更改值您可能正确地执行了第一点,我们没有看到这一点,但您正在通知私有字段已更改,并且您应该通知该属性已更改(NotifyPropertyChanged("GetCPUUsage")
)。您也可以通过直接访问字段(_cpuUsage = 40;
)来设置值,您应该通过setter(GetCPUUsage = 40;
)来设置。
在这种情况下,您的属性名称有点奇怪。我将GetCPUUsage
重命名为CPUUsage
,因为您可以获取并设置它的值。前缀获取也应该用于方法,而不是属性。
答案 1 :(得分:1)
看起来你几乎是对的,至少从编辑中看。只是,您在字段名称而不是属性名称上引发了更改的属性。这是修复:
public int CPUUsage
{
get { return _cpuUsage; }
set
{
_cpuUsage = value;
NotifyPropertyChanged("CPUUsage"); // Notify CPUUsage not _cpuUsage
}
}
并且您的绑定应该看起来像{Binding Path = CPUUsage}