2012-01-28 3 views
1

포 그라운드 프로세스 (또는 특정 프로세스)의 해당 시점에서 CPU 및 RAM 사용을 검색하고 싶습니다. 창 제목을 가져 오는 것이 문제가 아니며 해당 부분이 작동합니다. 그러나 활성 창이 70 % cpu 이상으로 실행중인 경우에도 cpu 디스플레이는 0 %로 유지됩니다.C# 특정 프로세스 (성능 카운터)에서 CPU 및 RAM 가져 오기

(int) pCPU.NextValue(); // < < < < 0 ...

참고 : 성능 카운터로 수행하고 싶습니다. 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 % (싱글 코어)에 CPU 사용을 미는 CPU 스트레스 테스트 프로그램을 실행할 때. 그런 다음 아래의 솔루션은 해당 프로세스의 CPU 사용량이 전체 CPU의 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 
} 
+0

본 적이 있습니까? http://openhardwaremonitor.org/? –

답변

0

당신의 카운터가 '속도'타입 샘플의 경우, 계산 된 샘플을 사용, 직접

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); 
+0

첫 번째 샘플이 작동하지 않습니다. 두 번째 샘플은 나에게 다른 CPU 사용법을 제공합니다. 나는 이미 정확한 CPU 부하를 측정하는 또 다른 카운터를 가지고 있으며, 하나의 프로세스가 60 %와 같이 표시되는 동안이 프로세스는 모든 프로세스에 대해 50 %를 표시합니다 ... 그건 좋지 않습니다. 또한 thread.sleep 없이는이 작업을 수행 할 수 없지만 같은 프로세스 또는 이전의 이전 카운터 샘플을 저장하지 않고도 동일한 주기로 수행 할 수 있습니까? 내 응용 프로그램은 프레임 속도에 종속적이므로 잠자 지 못합니다. sleep() 도중 프로세스가 닫히면 충돌이 발생할 수 있습니다. – Napoleon

+0

두 번째 샘플에서 더 많은 테스트를했는데 그 차이는 1 초 지연 때문에 발생했습니다. 너무 바보 같아요.하지만 확인 된 프로세스가 종료 될 때 내 프로그램이 중단됩니다. 초 (매우 가능성이있다). – Napoleon