2016-02-12 10 views
4

Я просто пытаюсь получить точное использование ЦП, которое соответствует диспетчеру задач. До сих пор я пробовал четыре рекомендуемых метода, которые не работают.Использование процессора не соответствует диспетчеру задач, PerformanceCounter или ManagementObjectSearcher

Во-первых, я пробовал аналогичные решения или предложения, которые я мог найти. В примере кода здесь используются четыре метода, все из которых являются неточными. Во-вторых, я знаю, что диспетчер задач колеблется и зависит от того, когда он отбирается. Это все еще не объясняет различия. Наконец, я знаю, что существуют разные методы, и что диспетчер задач использует только один метод. Поскольку это предназначено для обычных пользователей, оно должно быть близко к диспетчеру задач.

public partial class MainWindow : Window 
{ 
    //*** Method 1 & 2 
    PerformanceCounter cpuCounterPi = new PerformanceCounter("Processor Information", "% Processor Time", "_Total"); 
    PerformanceCounter cpuCounterP = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

    //*** method 3 
    ManagementObjectSearcher query1 = new ManagementObjectSearcher("select loadpercentage from win32_processor"); 

    //*** Mixed method usage below 
    CounterSample csPi1, csPi2, csP1, csP2; 
    double cpuPercentagePi, cpuPercentageP, cpuPercentageLoad; 
    int count = -1; 
    Boolean alternate = false; 

    System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
     dispatcherTimer.Interval = new TimeSpan(0, 0, 5); 
     dispatcherTimer.Start(); 
    } 

    private void dispatcherTimer_Tick(object sender, EventArgs e) 
    { 
     count++; 
     //***Method 1 & 2 
     if (alternate) 
     { 
      csPi1 = cpuCounterPi.NextSample(); 
      cpuPercentagePi = CounterSample.Calculate(csPi2, csPi1); 
      csP1 = cpuCounterP.NextSample(); 
      cpuPercentageP = CounterSample.Calculate(csP2, csP1); 

     } 
     else 
     { 
      csPi2 = cpuCounterPi.NextSample(); 
      cpuPercentagePi = CounterSample.Calculate(csPi1, csPi2); 
      csP2 = cpuCounterP.NextSample(); 
      cpuPercentageP = CounterSample.Calculate(csP1, csP2); 
     } 
     alternate = !alternate; 

     if (count==5) { textBox.Clear(); count = 0; } 
     textBox.Text = textBox.Text + "\nProcessor Information (Method 1)   " + cpuPercentagePi.ToString(); 
     textBox.Text = textBox.Text + "\nProcessor (Method 2)       " + cpuPercentageP.ToString(); 
     textBox.Text = textBox.Text + "\nProcessor ½ (Method 2 divided by 2) " + (cpuPercentageP/2).ToString(); 
     //***** Method 3 **** 
     ManagementObjectCollection cpuColl = query1.Get(); 
     foreach (ManagementObject mo in cpuColl) 
     { 
      cpuPercentageLoad = Convert.ToDouble(mo["loadpercentage"]); 
     } 
     textBox.Text = textBox.Text + "\nProcessor Load (Method 3)    " + cpuPercentageLoad.ToString() + "\n"; 

    } 

Вот два образца по сравнению с диспетчером задач. enter image description here enter image description here

От На картинке вы можете видеть, что я двухъядерный процессор с четырьмя логическими процессорами. Процессор является Intel Skylake i7-6650U, работающий под управлением Windows 10.

Благодаря

Для справки - Эти ссылки похожи: PerformanceCounter reporting higher CPU usage than what's observed How to get the CPU Usage in C#? Calculate CPU usage for a Windows process?

+0

Все еще не ответил и никакой работы не найдено. – Padawan256

ответ

1

У вас есть 2 ядра, но 4 потока, так вам нужно разделить на 4, а не 2. Также ваш метод WMI, который, как я подозреваю, будет проверять только на 1 ядро. Проверьте, есть ли на самом деле несколько объектов win32_processor.

+0

Если вы заметили, один метод разделит на два. Если я разделю на четыре, то единственный раз, когда он будет соответствовать на 100%, он скажет 25% и будет ужасно выключен. Поэтому, независимо от того, как я смотрю на это, performanceCounter - это далеко. Я рассмотрю несколько объектов win32_processor. – Padawan256

+0

Я думаю, что performanceCounter может быть настроен на чтение каждого ядра, но, как я понимаю, win32_processor читает весь процессор. Я не вижу возможности читать отдельные ядра с loadpercentage, поэтому кажется, что он должен читать всю загрузку процессора. Конечно, я, конечно, не эксперт. – Padawan256

+0

У кого-нибудь есть другие предложения? – Padawan256

 Смежные вопросы

  • Нет связанных вопросов^_^