0

スレッドから進行状況バーに 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;
}

そしてそれは正常に動作するので、cpuCounterand ループを使用したままにします。

誰でも私が犯した可能性のある間違いを指摘できますか.

ありがとう

編集 - 完全なクラスといくつかの微調整:

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
    }
4

2 に答える 2

1

少なくとも編集から見ると、ほぼ正しいように見えます。ただ、プロパティ名ではなくフィールド名で変更されたプロパティを上げています。修正は次のとおりです。

public int CPUUsage
        {
            get { return _cpuUsage; }
            set
            {
                _cpuUsage = value;
                NotifyPropertyChanged("CPUUsage"); // Notify CPUUsage not _cpuUsage
            }
        }

バインディングは {Binding Path=CPUUsage} のようになります

于 2012-07-31T21:40:51.003 に答える
1

変更を WPF ランタイムに通知する必要があります。そのために、INotifyPropertyChangedインターフェースを実装します。

ここでそれを試みているようですが、正しい方法では実行していません (関連するコードをすべて表示したわけではありませんが、実装が正しくないと確信しています)。

1. パブリック プロパティにバインドします (貼り付けたコードには表示されません) 2. 値が変更された場合、プロパティのセッターから通知を送信します 3. プロパティ セッターを介して値を変更します

ポイント 1 を正しく実行している可能性があります。これは表示されませんが、private フィールドが変更されたことを通知しているため、プロパティが変更されたことを通知する必要があります ( NotifyPropertyChanged("GetCPUUsage"))。また、フィールド ( ) に直接アクセスして値を設定_cpuUsage = 40;しており、セッター ( ) を介して行う必要がありますGetCPUUsage = 40;

このコンテキストでは、プロパティ名は少し奇妙です。値を取得および設定できるため、名前GetCPUUsageをに変更します。CPUUsageまた、プレフィックスGetは、プロパティではなくメソッドに使用する必要があります。

于 2012-07-31T21:26:46.680 に答える