C # Получить процессор и оперативную память от конкретного процесса (счетчики производительности) - PullRequest
1 голос
/ 28 января 2012

Я хотел бы получить информацию об использовании процессора и оперативной памяти в этот момент для процесса переднего плана (или определенного). Получение заголовка окна не является проблемой, и эта часть работает. Но дисплей процессора остается на 0%, даже если в активном окне работает процессор на 70% или более.

(интермедиат) pCPU.NextValue (); // <<<< продолжает возвращать 0 ... </p>

Примечание: я хочу сделать это с помощью счетчика производительности. Я не хочу делать это, используя переменную Process, потому что она может вызвать «недостаточные ошибки привилегий».

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    [DllImport("user32.dll")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);

    public void GetActiveCPUAndRam(out string windowTitle, out int CPUUsagePerc, out int RAMUsage)
    {
        IntPtr hwnd = GetForegroundWindow();
        uint pid;
        GetWindowThreadProcessId(hwnd, out pid);

        Process activeProc = Process.GetProcessById((int) pid);

        #region Window Title

        const int nChars = 256;
        StringBuilder Buff = new StringBuilder(nChars);
        if (GetWindowText(hwnd, Buff, nChars) > 0)
            windowTitle = Buff.ToString();
        else
        {
            windowTitle = "";
            CPUUsagePerc = 0;
            RAMUsage = 0;
            return;
        }

        #endregion

        #region RAM/CPU
        PerformanceCounter pCPU = new PerformanceCounter("Process", "% Processor Time", activeProc.ProcessName, true);
        pCPU.NextValue();
        CPUUsagePerc = (int)pCPU.NextValue(); // <<<<< problem here.

        RAMUsage = 0; // TODO:

        #endregion
    }



РЕДАКТИРОВАТЬ: Я попробовал новое решение: Но когда я запускаю программу стресс-тестирования процессора, которая увеличивает загрузку процессора до 100% (одноядерный). Затем приведенное ниже решение показывает, что загрузка процессора этим процессом составляет 300–400% от общего объема процессора… Очевидно, что-то все еще не так.
        private PerformanceCounter pCPU = null;
        private IntPtr PreviousProcHwnd = IntPtr.Zero;
        private CounterSample PreviousCPUCounterSample = CounterSample.Empty;

        public void GetActiveCPUAndRam(out string windowTitle, out int CPUUsagePerc, out int RAMUsage)
{
        ...
        #region RAM/CPU

        if (PreviousProcHwnd != hwnd)
        {
            PreviousProcHwnd = hwnd;
            pCPU = new PerformanceCounter("Process", "% Processor Time", activeProc.ProcessName,
                                                             true);
            PreviousCPUCounterSample = CounterSample.Empty;
        }

        CounterSample sample1 = pCPU.NextSample();
        CPUUsagePerc = (int)CounterSample.Calculate(PreviousCPUCounterSample, sample1);
        PreviousCPUCounterSample = sample1;
        RAMUsage = 0; // TODO:

        #endregion
}

1 Ответ

0 голосов
/ 28 января 2012

Не используйте значение напрямую, используйте расчетный образец,

CounterSample sample1 = pCPU.NextSample();
float value = CounterSample.Calculate(sample1);

если ваш счетчик является типовой выборкой, то вам нужно получить два образца,

CounterSample sample1 = counter.NextSample();
Thread.Sleep(1000); // wait some time
CounterSample sample2 = counter.NextSample();
float value = CounterSample.Calculate(sample1, sample2);
...