MFC(C++) CPU, Memory 체크 질문있습니다.

조회수 1295회

1번 프로그램(ex: Test 프로그램)을 실행시킨상태로 두고(단지 CPU 상태, Memory 상태 변화를위한)

2번 프로그램 (ex: check 프로그램)을 실행해서

감시(check)할 프로그램을 1번 프로그램으로 선택하고

1번 프로그램의 현재시각, CPU 상태, Memory 상태를 1초마다

2번 프로그램 List controll(View: Report)에 값을 Display해주고

*.txt파일로 로그를 남기는 프로그램을 제작할려고합니다.

실직적으로 구현할려고하니 감이 오지않아서

이런 기능이 가능한지,

어떤식으로 코딩해야하는지 조언 부탁드립니다.

// ----------------------------------------------------------------------------------------------------------------------------------------------//

추가로 몇가지 질문이있습니다.

거의다 구현한 상태인데 CPU 상태 체크부분에서 막히는부분이있어서 글올립니다.

double CCheckUtilDlg::getCPU()
{
    FILETIME ftime, fsys, fuser;
    ULARGE_INTEGER now, sys, user;
    double percent;

    GetSystemTimeAsFileTime(&ftime);
    memcpy(&now, &ftime, sizeof(FILETIME));

    GetProcessTimes(self, &ftime, &ftime, &fsys, &fuser);
    memcpy(&sys, &fsys, sizeof(FILETIME));
    memcpy(&user, &fuser, sizeof(FILETIME));

    **percent = (sys.QuadPart - lastSysCPU.QuadPart) + (user.QuadPart - lastUserCPU.QuadPart);**
    **percent /= (now.QuadPart - lastCPU.QuadPart);**
    **percent /= numProcessors;**

    lastCPU = now;
    lastUserCPU = user;
    lastSysCPU = sys;

    return percent * 100;
}

percent 계산부분에서

" warning C4244: '=' : 'ULONGLONG'에서 'double'(으)로 변환하면서 데이터가 손실될 수 있습니다. "

warning 해결방안과 percent 부분의 계산식이 올바른것인지

(첫줄 계산값이 거의 0이고 0이된 percent값은 또 나누면

-1.#IND000000000000 이런값이 Display됩니다.)

마지막으로 이미지

계산식으로 계산된값이 빨간 네모로 표시된 평균 CPU 값인건지 궁금합니다.

아니라면 평균CPU값을 읽어오는 방법이 있다면 어떻게 하는것인지 궁금합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 코드를 보시면 아시겠지만 getCPU 함수는 직전에 호출했던 당시의 값과 현재 값과의 차로 계산하고 있습니다. 해당 프로세스가 running 상태라고 하더라도 환경이나 시점에 따라 CPU 점유를 계속 한다는 보장은 없습니다. 시간을 조금 늘려서 테스트 해보시기 바랍니다. 다만 0값에 대한 예외처리는 필요해 보이는군요. 알 수 없는 사용자 2019.1.15 17:15
  • 평균값은 간단하게 표본값의 합을 표본의 개수로 나누면 구할 수 있습니다 알 수 없는 사용자 2019.1.15 17:16

1 답변

  • 우선 특정 프로세스의 CPU 및 Memory 상태를 Get 하는 방안이 필요하군요.

    하나씩 풀어보도록 하죠.

    먼저 CPU 및 Memory 상태를 얻는 방법은 WinAPIPDH를 이용하면 얻을 수 있습니다. 이 부분은 조금만 검색하면 바로 나오니 따로 적진 않겠습니다.

    아래 링크를 참조하시면 도움이 되시겠네요. 현재 프로세스의 CPU / Memory 상태를 얻어오는 방법이 나와있습니다.

    https://stackoverflow.com/questions/63166/how-to-determine-cpu-and-memory-consumption-from-inside-a-process

    우리가 원하는 것은 특정 프로세스의 상태정보기 때문에 GetCurrentProcess()로 얻은 현재 Process의 Handle 대신에 1번프로그램의 Process Handle을 알아야 위 링크에 있는 API로 상태정보를 Get할 수 있겠네요.

    이 부분도 검색하시면 다양한 방법이 있는데 우선 아래 링크를 참조하시면 원하는 프로세스 핸들을 얻을 수 있습니다.

    http://ddiggam.tistory.com/59

    이제 위 내용을 바탕으로 해서 1초 단위로 loop 를 돌면서 CPU / Memory 상태를 얻은 후 listview 및 file 에 기록하도록 구현하시면 됩니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)