前提・実現したいこと
C#のSystem.Diagnostics.PerformanceCounterを使用してCPUの使用率を取得しようとしています。
http://home.a00.itscom.net/hatada/windows/tips/performance01.html を参考にしてマルチコアCPUのやり方でやろうとしたのですが、うまく行きません。
目標としては、タスクマネージャに表示されている値の近似値を表示することです。
発生している問題・エラーメッセージ
RAMの使用量は正確なのですが、CPUの使用率は正確に表示されません。
タスクマネージャーで表示される値との差がとても大きく、0%などありえない表示が多いです。
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Timers; using System.Windows.Threading; using System.Diagnostics; using System.Management; namespace InfoBox { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); CallTimer(); } DispatcherTimer dispatcherTimer; void CallTimer() { dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal); dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 0); // 100mSec dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); dispatcherTimer.Start(); } int T = 0; private void dispatcherTimer_Tick(object sender, EventArgs e) { // メイン処理 CPU_P.Text = getCpuUsage(T).ToString() + "%"; // CPU Usage RAM_P.Text = getRamUsage().ToString() + "%"; // RAM Usage T++; } // CPU Usage //PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); float x; PerformanceCounter[] CPUs = new PerformanceCounter[Environment.ProcessorCount]; int getCpuUsage(int T) { x = 0; if (T == 0) { for (var i = 0; i < CPUs.Length; i++) { CPUs[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString()); } } for (var j = 0; j < CPUs.Length; j++) { x += CPUs[j].NextValue(); Console.Write(CPUs[j].NextValue() + " "); } Console.Write(" " + x); Console.WriteLine(); return (int)(x / (100 * CPUs.Length) * 100); //return (int)cpuCounter.NextValue(); } // RAM Usage PerformanceCounter ramCounter = new PerformanceCounter(); int getRamUsage() { ramCounter.CategoryName = "memory"; ramCounter.CounterName = "Available MBytes"; ramCounter.MachineName = "."; float RamAva = (8192 - ramCounter.NextValue()) / 8192 * 100; //Console.WriteLine(RamAva); return (int)RamAva; } } }
試したこと
C#
1PerformanceCounter pc = new PerformanceCounter("Processor", "% Processor Time", "_Total") 2float cpuusage = pc.NextValue();
と、上のコードをfor文でコアごとに実行してコアごとに取得する方法です。(上記ソースコード)
僕が調べた限りでは、上の一行でも最初の値を捨てれば正しい値が取得できたというものもありましたが、僕の環境では無理でした。
補足情報(FW/ツールのバージョンなど)
VisualStudio 2019 最新版
Windows 10 Pro 64bit 最新版
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/28 00:59