메모내용
Win32API :: UseFull

타이머 설정 함수

CMOS

CMOS ( Complementary metal-oxide semiconductor ) 하드웨어에는 CMOS 라는 타이머가 있다. BIOS 와 UEFI 에서 설정되어 있는 값을 저장하는 칩이다. 베터리가 있어서 전원이 꺼져도 계속 저장할 수 있도록 해주는 역할을 한다. CMOS 에 는 시간에 대한 정보들이 있고, 이것을 가져와 쓸 수 있게 하는것이 Timer 이다.

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 :{
                                        // ...
                                    }
                                }

                            }