Проверьте использование процессора и зарегистрируйте процессы, в которых загрузка Windows составляет до 30% - PullRequest
1 голос
/ 23 июля 2011

У меня 3 реляционных вопроса:

Я хочу проверить использование процессора и написать этот код:

public partial class MainWindow : Window
{
    private DataTable tbl;
    private int ID;
    private DispatcherTimer Timer;
    private BackgroundWorker bgw;
    public MainWindow()
    {
        InitializeComponent();
        this.listView.DataContext = CreateDataTable();

        Timer = new DispatcherTimer();
        ID = 0;
        Timer.Interval = TimeSpan.FromMilliseconds(2000);
        Timer.Tick += new EventHandler(Timer_Tick);
        bgw = new BackgroundWorker();
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        this.listView.DataContext = tbl; 
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        try
        {
            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");

            foreach (ManagementObject queryObj in searcher.Get())
            {
                string s = queryObj["LoadPercentage"].ToString();
                decimal d = decimal.Parse(s);
                tbl.Rows.Add(ID++, DateTime.Now, d);
            } 
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        if (bgw.IsBusy == false)
        {
            bgw.RunWorkerAsync();
        }
    }

    DataTable CreateDataTable()
    {
        tbl = new DataTable("Customers");

        tbl.Columns.Add("ID", typeof(int));
        tbl.Columns.Add("Time", typeof(DateTime));
        tbl.Columns.Add("Percent", typeof(decimal));

        return tbl;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Timer.IsEnabled = true;
    }
}

Я проверяю использование ЦП по запросу в WMI в течение 2 секунд и регистрирую использование ЦП в DataTable. У меня есть две проблемы:

  1. Я использовал BackGroundWorker и в DoWork я добавляю новую строку своей информации журнала в DataTable, а в RunWorkerCompleted Событии я назначаю Мой DataTable моему ListView, но когда мой * У 1017 * есть строки, но мой ListView ничего не показывает.

  2. Использование ЦП, которое запрашивает WMI, отличается от «Диспетчера задач». Почему?

  3. Как получить процесс с максимальной загрузкой ЦП с использованием WMI?

спасибо

Редактировать 1)

для № 1 достаточно обновить элементы в ListView

Ответы [ 3 ]

1 голос
/ 23 июля 2011

Также вы можете проверить этот проект: Как получить использование процессоров и потоков

1 голос
/ 23 июля 2011

Ваш код имеет несколько недостатков. Это не идеально (например, я не использую ListView, как вы), но он должен дать вам отправную точку.

Прежде всего, не обновляйте источник данных непосредственно в обработчике событий DoWork.

namespace WindowsFormsApplication1
{
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Management;

    public partial class Form1 : Form
    {
        private Timer Timer = new Timer();
        private BackgroundWorker bgw = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();

            Timer.Interval = 2000;
            Timer.Tick += Timer_Tick;
            bgw.DoWork += bgw_DoWork;
            bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
        }

        void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Result is Exception)
            {
                Timer.Stop();
                MessageBox.Show(((Exception)e.Result).ToString());
            }
            else
            {
                var result = (UInt16)e.Result;

                listBox1.Items.Add(result.ToString());
            }
        }

        static void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                ManagementObjectSearcher searcher =
                                new ManagementObjectSearcher("root\\CIMV2",
                                "SELECT * FROM Win32_Processor");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    e.Result = (UInt16)queryObj["LoadPercentage"];
                    return;
                }
            }
            catch (Exception ex)
            {
                e.Result = ex;
            }
        }

        void Timer_Tick(object sender, EventArgs e)
        {
            if (bgw.IsBusy == false)
            {
                bgw.RunWorkerAsync();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Timer.Start();
        }
    }
}

Это должно помочь вам решить вопрос 1.

Вопрос 2. Полагаю, это, скорее всего, связано с выборкой.

Вопрос 3, не уверен. Вы можете легко отслеживать максимальное значение, возвращаемое вашим работником - это будет максимальная загрузка процессора.

0 голосов
/ 23 июля 2011

Вы не должны добавлять строку в другой поток. Поэтому вам нужно использовать событие ProgressChanged для диалога с другим потоком:

bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.WorkerReportsProgress = true;

Затем, когда это событие сработает, добавьте строку:

void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Tuple<int, DateTime, decimal> rowToAdd = e.UserState as Tuple<int, DateTime, decimal>;
            listBox1.Items.Add(rowToAdd.Item1, rowToAdd.Item2, rowToAdd.Item3);
        }

И в dowork, когда вы хотите добавить строку:

void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker _bgw = sender as BackgroundWorker;
            _bgw.ReportProgress(0, new Tuple<int, DateTime, decimal>(ID++, DateTime.Now, d));
        }        

Вы можете прочитать о кортежах здесь: Кортеж , но если ваша версия фреймворка слишком мала, вместо этого создайте пользовательский объект для хранения информации.

Остальные 2 вопроса, я бы ответил методом проб и ошибок;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...