2013-11-27 1 views
0

여기에 나와있는 다른 CPU 사용 관련 질문을 읽었지만 코드가 작동하지 않는 이유가 무엇인지 궁금합니다.CPU 사용 문제

From1에서 "ComputerPerformance"라는 별도의 클래스에 코드가 있습니다.

class 
{ 
    private string cCpuUtilization; 

    public void cpuUtilization() 
    { 
     try 
     { 
     PerformanceCounter cpuCounter; 
     cpuCounter = new PerformanceCounter(); 
     cpuCounter.CategoryName = "Processor"; 
     cCpuUtilization = cpuCounter.NextValue() + "%"; 
     } 
     catch(System.InvalidOperationException e) 
     { 
     } 
    } 

    public String getCPUUtilization() 
    { 
     return cCpuUtilization; 
    } 
} 

코드는 잘 실행,하지만 난

업데이트 ... 출력으로 아무것도 점점하지 오전

코드는 이제 다음과 같습니다

PerformanceCounter cpuCounter = new PerformanceCounter(); 
cpuCounter.CategoryName = "Process"; 
cpuCounter.CounterName = "Private Bytes"; 
cpuCounter.InstanceName = "Explorer"; 
cCpuUtilization = cpuCounter.NextValue().ToString() + "%"; 

내 문제 지금은 값을 반환합니다 : 6.728499E + 07 % 항상 ... 이것이 어떤 이유일까요?

+3

try/catch 블록을 없애고 잘못 된 부분을 찾아 낼 수 있습니다. –

+0

방금했습니다 및 오류 : 처리되지 않은 예외 'System.InvalidOperationException'System.dll이 발생했습니다. 추가 정보 : CounterName 없으므로 초기화하지 못했습니다. 그 의미가 확실하지 않습니다 ... –

+4

"CounterName"속성이 설정되지 않았 음을 의미합니다. 어쩌면 문서를보십시오. 그리고 너 자신에게서 예외를 숨기지 마라. –

답변

1

6.728499E+07%을 얻은 이유에 대해 이 아닌 Private Bytes 메모리를 잘 읽고 있습니다. 따라서 반환되는 숫자는 탐색기에서 사용하는 개인 바이트 수입니다 (약 67,284,990 바이트). 당신이 scientfic 표기를하지 않으려면 그 많은 수의 전달을위한 number formatting stringToString

cCpuUtilization = cpuCounter.NextValue().ToString("N0") + " bytes"; //Should now print "67,284,990 bytes" 
0

The code runs fine, but I am getting nothing as an output...

아니, 코드 은하지 잘하지 실행 :

  1. 당신은 결코 것 없다 예외 처리 때문에 오류에 대해 알려줍니다.
  2. 코드가으로 잘 실행되면 출력이 생성됩니다.

코드는 InvalidOperationException이되는 오류를 명시 적으로 무시합니다. 예외는 이유가 있으며, 보통 심각하게 잘못된 점이 있음을 알려줍니다. 당신이 사용해야하는 유일한 시간은 그들을 무시해야합니다. 실제로는 예외가 발생하지 않도록주의하십시오. 코드에서

당신은 당신이보고있는 카운터의 어떤 그룹 나타 내기 위해 CategoryName을 설정하지만, 사용하는 카운터를 지정 CounterName 속성을 설정하지 않습니다. 그리고 Processor 그룹의 경우 잠재적으로 다중 프로세서가 있기 때문입니다.

다음 문제는 cpuCounter.Nextvalue()에서 얻은 첫 번째 결과는 0.0입니다. 항상. NextValue 메서드는 카운터에서 샘플을 가져 와서 마지막 샘플과 비교하여 실제 값을 계산합니다. 필연적으로 유효한 결과를 얻으려면 지연 시간이 두 시간이면 NextValue 번까지 두 번 전화해야합니다. 지연 시간은 최소한 1 초 이상이어야합니다. 여기

는 문제의 몇 가지 수정하는 코드이다 : 그것은 당신을 위해 빠른 충분하지 않으면

public class CPUTime : IDisposable 
{ 
    private PerformanceCounter counter; 
    private DateTime lastcheck; 
    private float lastvalue; 

    public float Value 
    { 
     get 
     { 
      if ((DateTime.Now - lastcheck).TotalMilliseconds > 950) 
      { 
       lastvalue = counter.NextValue(); 
       lastcheck = DateTime.Now; 
      } 
      return lastvalue; 
     } 
    } 

    public CPUTime() 
    { 
     counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); 
     counter.NextValue(); 
     lastcheck = DateTime.Now; 
    } 

    ~CPUTime() 
    { 
     Dispose(); 
    } 

    public void Dispose() 
    { 
     if (counter != null) 
     { 
      counter.Dispose(); 
      counter = null; 
     } 
    } 

    public override string ToString() 
    { 
     return string.Format("{0:0.00}%", Value); 
    } 
} 

을 - 결국 초에 한 번씩 그것은 단지 업데이트 - 당신이 GetSystemTimes API를 사용해야합니다 전화를 걸어 자신의 계산을하십시오. 여전히 두 개의 샘플이 필요하지만 훨씬 더 자주 호출하여 합리적인 결과를 얻을 수 있습니다.