프로그래밍
CPU 점유율 표시하기
by ictlab
2009. 9. 22.
개발을 하다보면 가끔 현재 프로그램의 CPU 점유율을 표시하고 싶을때가 있다.
프로그램이 부하를 받고 있는지 확인용으로 이용할 수 있고
로그를 남기면 나중에 확인해볼 수도 있다.
회사에서 개발한 프로젝트에 사용하려고 간단히 만들어보았다.
CPU점유율을 리턴하는 함수
//----------------------------------------------------------------------------
// 현재 프로세스의 CPU 점유율을 구하는 함수
// 듀얼코어를 인식 못하는 듯 하다..듀얼코어 CPU에서는 작업관리자에서 // 표시되는 값보다 대략 2배 정도 큰 값이 나온다. // 싱글 코어 기준으로 계산되는듯하다.
bool GetCpuShare(double &dShare)
{
static double oldTime = XfGetTime(); //start 상태의 가장 마지막 값을 저장한다.
static __int64 iOldKernelTime=0, iOldUserTime=0;
LARGE_INTEGER iCreationTime, iExitTime, iKernelTime, iUserTime;
bool ret = false;
if( GetProcessTimes( GetCurrentProcess() , (LPFILETIME) &iCreationTime, (LPFILETIME) &iExitTime
, (LPFILETIME) &iKernelTime, (LPFILETIME) &iUserTime ) == TRUE )
{
if( iOldKernelTime > 0)
{
__int64 sum = iKernelTime.QuadPart - iOldKernelTime + iUserTime.QuadPart - iOldUserTime;
sum /= 10000; // 100 nano sec 단위에서 msec 단위로 변환
if( XfGetTime() - oldTime > 0)
{
dShare = sum / (XfGetTime()-oldTime) * 100.0 ;
ret = true;
}
}
iOldKernelTime = iKernelTime.QuadPart;
iOldUserTime = iUserTime.QuadPart;
oldTime = XfGetTime();
}
return ret;
} |
사용하는 방법
100 msec 타이머에서 돌리는 상황을 가정하였다.
내부에.. 다음과 같이 count 변수를 두어 시간을 계산하였다.
static int count = 0;
count ++ ;
LOG_PRINTF 함수는 회사에서 사용하는 LOG 출력용 함수이다. 개별적으로 사용하는 로그 기록용 함수를 사용하면 되겠다.
if( count % 5 == 0 ) // 0.5초에 한번 표시
{
double dShare;
if( GetCpuShare(dShare) == true)
{
String sBuf;
sBuf.printf("%3.1lf %%", dShare);
ST_CPU->Caption = "CPU:" + sBuf;
// 5초에 한번 LOG 남김
if( count % 50 == 0)
{
LOG_PRINTF("★CPU★","CPU점유율 : %.1lf %%", dShare);
}
}
} |