2016-06-22 6 views
0

Dynamic Data Display libraryを使用してWPFでCPUパフォーマンスを表示したいですか?WPFで複数のコアパフォーマンスを表示

ここにコードがあります。

using System; 
using System.Diagnostics; 
using System.Windows; 
using System.Windows.Media; 
using System.Windows.Threading; 
using Microsoft.Research.DynamicDataDisplay; 
using Microsoft.Research.DynamicDataDisplay.DataSources; 

namespace WpfPerformance 
{ 
    public partial class MainWindow : Window 
    { 
     private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>(); 
     private PerformanceCounter cpuPerformance = new PerformanceCounter(); 
     private DispatcherTimer timer = new DispatcherTimer(); 
     private int i = 0; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void AnimatedPlot(object sender, EventArgs e) 
     { 
      cpuPerformance.CategoryName = "Processor"; 
      cpuPerformance.CounterName = "% Processor Time"; 
      cpuPerformance.InstanceName = "_Total"; 

      double x = i; 
      double y = cpuPerformance.NextValue(); 

      Point point = new Point(x, y); 
      dataSource.AppendAsync(base.Dispatcher, point); 

      cpuUsageText.Text = String.Format("{0:0}%", y); 
      i++; 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      plotter.AddLineGraph(dataSource, Colors.Green, 2, "Percentage"); 
      timer.Interval = TimeSpan.FromSeconds(1); 
      timer.Tick += new EventHandler(AnimatedPlot); 
      timer.IsEnabled = true; 
      plotter.Viewport.FitToView(); 
     } 
    } 
} 

結果は次のとおりです。 CPU

ただし、コードは1CPUのみです。最新のマシンでは、マシンには多くのコアがあります。私が望むのは、コアのパフォーマンスを表示することです。

私の考えは、コアを処理するタスクを使用することです。各コアの

private PerformanceCounter[] cpuPerformance = new PerformanceCounter[System.Environment.ProcessorCount]; 

、私はパフォーマンスショーを行うためにタスクを使用します。更新されたコードは

public partial class MainWindow : Window 
{ 
    //private ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>(); 
    private PerformanceCounter[] cpuPerformance = new PerformanceCounter[System.Environment.ProcessorCount]; 
    private DispatcherTimer timer = new DispatcherTimer(); 
    private int i = 0; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    private async void AnimatedPlot(object sender, EventArgs e) 
    { 
     var t = new Task[cpuPerformance.Length]; 
     for (int j = 0; j < cpuPerformance.Length; j++) 
     { 
      t[j] = new Task(() => 
      { 
       ObservableDataSource<Point> dataSource = new ObservableDataSource<Point>(); 
       plotter.AddLineGraph(dataSource, Colors.Green, j+1, "Percentage"); 
       cpuPerformance[j] = new PerformanceCounter("Processor", "% Processor Time", j.ToString()); 
       double x = i; 
       double y = cpuPerformance[j].NextValue(); 

       Point point = new Point(x, y); 
       dataSource.AppendAsync(base.Dispatcher, point); 

       cpuUsageText.Text = String.Format("{0:0}%", y); 
       i++; 
      } 
      ); 
     } 
     await Task.WhenAll(t); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     timer.Interval = TimeSpan.FromSeconds(1); 
     timer.Tick += new EventHandler(AnimatedPlot); 
     timer.IsEnabled = true; 
     plotter.Viewport.FitToView(); 
    } 
} 

ですが、何も表示されません。何が間違っているのか理解するのを手伝ってください。

答えて

1

物事のカップル:あなたは一度PerformanceCounterをインスタンス化しているあなたの「シングルコア」の例では

。あなたのマルチコアでは、グラフを更新するたびにそれをやっています。

また、正しく使用しているのでしょうか。これらのタスクが異なるコア上で実行されると仮定しているようですが、それがコアのパフォーマンスを数えるものです。

私はそのライブラリに慣れていないが、私はこれを行うだろう:

  1. は、タスクを取り除きます。

  2. は、コンストラクタで一度

  3. をPerformanceCountersをインスタンス化正しくPerformanceCounterクラスを使用する方法をよく読んで。

+0

あなたはPerformanceCounterアレイには不要なことはありますか? – Bigeyes

+0

そのコメントの意味がわかりません。 –

+0

[この回答](http://stackoverflow.com/questions/5537286/how-to-get-cpu-usage-for-more-than-2-cores)を見ると、その答えで各プロセッサは自分のパフォーマンスカウンタ。コンストラクターはどういう意味ですか? performanceCountersをMainWindowのコンストラクタに渡す必要があるのですか? – Bigeyes

関連する問題