CMOS ( Complementary metal-oxide semiconductor ) 하드웨어에는 CMOS 라는 타이머가 있다. BIOS 와 UEFI 에서 설정되어 있는 값을 저장하는 칩이다. 베터리가 있어서 전원이 꺼져도 계속 저장할 수 있도록 해주는 역할을 한다. CMOS 에 는 시간에 대한 정보들이 있고, 이것을 가져와 쓸 수 있게 하는것이 Timer 이다.
일정한 시간 간격으로 함수 호출 또는 WM_TIMER 메시지를 발생시킨다. 2016년 기준 32개까지 타이머를 설정할 수 있다는데, 많이 설정할 수록 OS 에 부담된다. (추측이지만, FD_SET 같은것을 사용하는것이 아닐까. 32 개라면, int32 각 비트수와 일치하는데..)
UINT_PTR SetTimer(
HWND hWnd;
UINT_PTR nIDEvent, // 중복되지 않는 아이디부여
UINT uElapse, // ms 단위 시간 입력. 1000ms == ls
TIMEPROC lpTimerFunction // 함수포인터(콜백함수) 또는 사용하지않는다면, NULL or 0 을 입력해준다
)
BOOL KillTimer(
HWND hWnd,
UINT_PTR uIDEvent // unsingned int , usigned_int64
)
//-------------------------------------------------------------------------------------------------
// Timer Callback 함수
VOID CALLBACK TimerProc(
HWND hWnd,
UINT uMsg, // WM_TIMER 메시지가 들어온다
UINT_PTR idE, // 아이디
DWORD dwTime // 경과된 시간, 설정한 시간이 계속 들어오는것 같다.
)
WndProc( hWwd , msg, lParam, wParam){
switch()
{
case WM_CREATE : {
/*
사용방법 1 . WM_TIMER 사용
WM_TIMER (lpTimerFunction = NULL || lpTimerFunction = 0) 으로 설정한다면
메시지로 처리할 수 있다.
*/
SetTimer(hWnd, 1, 1000, NULL); // 1 초마다 호출
SetTimer(hWnd, 2, 1000, NULL); // 2 초마다 호출
/*
사용방법 2. CALLBACK 사용
콜백으로 사용하는경우 형식이 정해져 있다. 다른형식을 쓸 수 없다.
*/
SetTimer(hWnd, 3, 1000, TimerProc);
break;
}
case WM_TIMER:{
// 이때 wParam 에는 SetTimer 의 호출당시 입력한 아이디가 들어온다.
switch(wParam)
{
case 1:{
// Timer ID 1 수행
break;
}
case 2:{
// Timer ID 2 수행
break;
}
}
}
case WM_DESTROY:{
// 타이머 삭제
KillTimer(hWnd, 1);
KillTimer(hWnd, 2);
KillTimer(hWnd, 3);
POSTQuitMessage(0);
break;
}
default :{
// ...
}
}
}