안녕하세요? 수구리입니다.
이전 포스팅에서는 간단한 MFC Thread 예제를 살펴보았었는데요
최근에 간단한 프로젝트로 pc의 작업 관리자에서 리소스 모니터처럼 PC의 자원들 (CPU, RAM, DISK 등..)을 실시간으로 모니터링하는 Win32 app을 만들어보고 있습니다.
그래서 생각한게 CPU 사용량을 가져오기 위한 Thread,
RAM의 사용량을 가져오기 위한 Thread 등등을 생각하고 있었는데 Thread 기능과 비슷한? Ontimer와 SetTimer함수가 있더라고요 그래서 제가 진행하고 있는 코드에서 어떤 식으로 활용했는지 기록해보겠습니다.
[ Ontimer와 SetTimer? ]
우선 위의 함수들은 WM_TIMER라는 이벤트가 발생할 경우 콜백되어지는 함수입니다.
WM_TIME을 설정하는 방법은 리소스에서 다이얼로그 속성창에서 메시지 아이콘이 있는데
이 버튼을 눌러서 window에서 제공하는 많은 메시지(WM)를 확인할 수 있습니다.
이 중에서 WM_TIMER에 이미 OnTimer라는 함수가 기본적으로 설정되어 있고,
만약 안되어있으면 추가를 해주면 됩니다.
그럼 이 함수는 어떻게 사용하는 거냐? 바로 SetTimer 함수를 사용하는 겁니다.
UINT_PTR SetTimer(
[in, optional] HWND hWnd,
[in] UINT_PTR nIDEvent,
[in] UINT uElapse,
[in, optional] TIMERPROC lpTimerFunc
);
위는 SetTimer 함수의 Syntax입니다. 여기서 nIDEvent는 타이머의 식별자로 그냥 타이머마다 ID를 설정해준다 정도로 생각하면 될 것 같습니다.
그리고 uElapse는 시간 제한 값으로 단위는 ms입니다. 그러면 여기다 1000이라는 값을 주면 1초를 주기로 반복한다는 거겠죠? [ Sleep(1000)과 동일 ]
총 4개의 인자를 보여주고 있지만, 첫 번째 인자와 마지막 인자는 옵션이네요.
afx_msg void OnTimer(UINT_PTR nIDEvent);
위의 코드는 OnTimer의 형태입니다.
nIDEvent는 위의 SetTimer에서 보았던 타이머의 ID가 보이죠? 즉, 타이머의 식별자를 지정한다는 의미입니다.
이제 제가 SetTimer와 OnTimer의 흐름에 대해서 알려드리겠습니다.
우선 헤더파일의 일부분입니다.
public:
// 생략
afx_msg void OnTimer(UINT_PTR nIDEvent);
// 생략
헤더에서는 딱히 하는 게 없죠? 그냥 헤더에서는 OnTimer 함수를 쓰겠다! 정도로 선언해줍니다.
바로 구현 파일인 cpp파일로 가보겠습니다.
// 구현파일.cpp
void CRealTimeMemoryProgramDlg::OnTimer(UINT_PTR nIDEvent)
{
switch (nIDEvent)
{
case 1:
Get_MemoryInfo();
break;
case 2:
Get_TotalUsageOfCPU();
break;
}
CDialogEx::OnTimer(nIDEvent);
}
이 부분에서 이제 각 타이머마다 부여받은 ID에 따라서 수행할 동작들을 분기해줍니다.
만약 타이머의 ID값인 nIDEvent값이 1이 온다면, Get_MemoryInfo();라는 Memory의 정보들을 가져오는 함수를 실행시키겠다 라는 의미가 되겠죠?
그러면 이제 SetTimer 부분을 보시죠 같은 구현 파일 cpp파일에 있습니다.
// 구현파일.cpp
// TODO: 여기에 추가 초기화 작업을 추가합니다.
SetTimer(1, 150, NULL); // 이벤트 ID 1 : RAM 사용율
// CPU 관련 클래스 초기화
cpuUsage.init();
cpuUsage.InitReg();
cpuUsage.InitCPUName();
Get_CPU_Name();
SetTimer(2, 600, NULL); // 이벤트 ID 2 : CPU 사용율
// 시스템 정보 초기화 및 불러오기
Get_SysInfo();
위의 // TODO: 부분은 MFC 프로젝트를 많이 해보셨다면 정말 많이 보았을 것이라고 생각합니다.
간단히 말해 MFC 프로젝트를 생성하면 추가로 초기화 작업이 필요한데 저 주석 아랫부분에 추가를 해주는 것이죠.
이 부분에서 SetTimer 함수를 사용하죠!
보시면 ID를 1 로주고, 150ms만큼 반복하겠다는 의미로 해석하시면 될 것 같습니다.
정리를 하면, SetTimer는, OnTimer 함수를 호출하는데, 타이머의 ID값을 넘겨주고, 반복할 작업 또는 함수를 어느 주기만큼 타이머를 설정하겠다!라고 생각하시면 이해하기 쉬울 것 같습니다.
그러면 ID 1번이 오면 Get_Memory_Info()라는 함수는 150ms의 주기마다 호출이 될 거고,
ID 2번이 오면, Get_TotalUsageCPU()라는 함수를 600ms의 주기마다 호출한다는 것입니다.
Thread랑 Timer랑 개념이 비슷한 것처럼 보이죠?
[ KillTimer() ]
// killtimer
void CAboutDlg::OnDestroy()
{
CDialogEx::OnDestroy();
KillTimer(1);
KillTimer(2);
}
마지막으로 위의 코드는 타이머 ID를 넘겨주면서 KillTimer 함수를 호출하면 해당 타이머를 종료한다는 의미입니다.
이상으로 MFC 다이얼로그 프로젝트에서 OnTimer와 SetTimer에 대한 정리를 마치겠습니다.
감사합니다!
'🌈 프로그래밍 > MFC' 카테고리의 다른 글
[ MFC, C++ ] BYTE to CString, CString to int 형변환 (0) | 2022.01.26 |
---|---|
[ MFC ] list control header 클릭 시 정렬 기능 이벤트 구현 (3) | 2021.11.08 |
[ MFC ] AfxBeginThread를 사용한 Timer 예제 (1) | 2021.10.20 |
MFC 프로그래밍 시작하기 (4) | 2021.08.06 |