質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

4642閲覧

C#でCPUの使用率を取得してWPFで表示したい。

Hiro527

総合スコア27

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

2クリップ

投稿2020/04/27 12:13

編集2020/04/27 12:43

前提・実現したいこと

C#のSystem.Diagnostics.PerformanceCounterを使用してCPUの使用率を取得しようとしています。
http://home.a00.itscom.net/hatada/windows/tips/performance01.html を参考にしてマルチコアCPUのやり方でやろうとしたのですが、うまく行きません。
目標としては、タスクマネージャに表示されている値の近似値を表示することです。

UIはこんな感じです。
UI

発生している問題・エラーメッセージ

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 最新版

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

自PC環境では下記コードでタスクマネージャに比較的近いCPU使用率は取れましたが、タスクマネージャがどうやって取得しているかは分からないので、合っているかどうかは不明です。
System.Management アセンブリ参照の追加が必要です。
Win32_PerfFormattedData_PerfOS_Processor からコア毎の使用率も取れるみたいですが、結構バラつきが大きい気がします。

C#

1var searcher = new System.Management.ManagementObjectSearcher("select LoadPercentage from CIM_Processor"); 2foreach (var obj in searcher.Get()) 3{ 4 var usage = obj["LoadPercentage"]; 5 Console.WriteLine("LoadPercentage : " + usage); 6}

投稿2020/04/27 15:41

編集2020/04/27 15:53
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hiro527

2020/04/28 00:59

ありがとうございます!かなりの近似値を取得することができました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問