본문 바로가기
프로그래밍

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); } } }