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();
}
}
}
ただし、コードは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();
}
}
ですが、何も表示されません。何が間違っているのか理解するのを手伝ってください。
あなたはPerformanceCounterアレイには不要なことはありますか? – Bigeyes
そのコメントの意味がわかりません。 –
[この回答](http://stackoverflow.com/questions/5537286/how-to-get-cpu-usage-for-more-than-2-cores)を見ると、その答えで各プロセッサは自分のパフォーマンスカウンタ。コンストラクターはどういう意味ですか? performanceCountersをMainWindowのコンストラクタに渡す必要があるのですか? – Bigeyes