ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OnTimer 함수
    Windows 프로그래밍 2019. 1. 3. 11:16


    목요일마다 주간보고서를 써야 하는데 까먹는 날이 종종 있었다. 그래서 매주 목요일마다 주간보고서 파일을 자동으로 생성해주는 서비스를 만들게 되었다. 이때 사용한 함수가 OnTimer 함수이다.


    주기적으로 시간 체크를 해야 했기에 특정 시간마다 현재 시간을 체크해주는 함수가 필요했다.

    OnTimer는 그런 역할을 해주는 함수이다. 이제 사용법을 알아보자.


    Dialog 속성에서 메시지 탭을 보면 아래처럼 WM_TIMER가 있다. 여기서 OnTimer를 눌러 메시지를 추가한다.

    Message Map에 ON_WM_TIMER가 추가된 것을 볼 수 있다.

    BEGIN_MESSAGE_MAP(CMutexProjectDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_TIMER() // 요고 ON_WM_QUERYDRAGICON() END_MESSAGE_MAP()

    그 다음, 다이얼로그 헤더파일에 아래와 같이 OnTimer 함수를 오버라이딩 해준다.

    public:
    	afx_msg void OnTimer(UINT_PTR nIDEvent);	// 표준 생성자입니다.

    이제 사용만 하면 된다. SetTimer 함수를 통해 함수를 실행할 텀을 정할 수 있다.

    UINT_PTR SetTimer(
    	HWND      hWnd,
    	UINT_PTR  nIDEvent, // 타이머 번호
    	UINT      uElapse, // 시간(밀리세컨드)
    	TIMERPROC lpTimerFunc // NULL
    );
    

    HWND 값을 넘겨주지 않으면 새로운 타이머를 식별하는 타이머 번호를 리턴한다고 한다. (난 그냥 안주고 썼는데??? 정확히는 모르겠다..)


    MSDN : https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-settimer

    타이머는 여러 개 설정할 수 있기 때문에 2번 인자인 타이머 번호로 구별하게 된다. 하나만 사용할 시에는 1번을 주면 된다.

    세 번째 인자는 얼만큼 시간을 두고 함수를 실행할 건지 밀리세컨드 단위로 주면 된다.

    네 번째는 NULL을 주면 WM_TIMER 메세지를 날리고 그 메세지를 받아서 OnTimer 함수를 실행하게 된다.


    0.1초 간격으로 함수를 실행하고 싶다면

    SetTimer(1, 100, NULL);

    이렇게 주면 된다.

    그리고 이제 OnTimer 함수를 선언하여 주기적으로 실행시키고 싶은 동작을 수행하면 된다.

    void CMutexProjectDlg::OnTimer(UINT_PTR nIDEvent) {
    	// 시간을 체크한다던지 뭐든 하면 된다
    }

    저기서 인자로 들어온 nIDEvent는 SetTimer 함수의 두 번째 인자인 타이머 번호이다. 따라서 여러 개의 타이머를 사용할 때에는 if문이나 Switch-Case 문을 통해 nIDEvent의 번호에 따라 다른 동작을 수행시키면 된다.


    배고프다..ㅜ


    'Windows 프로그래밍' 카테고리의 다른 글

    Volatile 변수란?  (2) 2019.01.07
    Service 프로세스에서 winlogon.exe  (0) 2019.01.03
    Mutex와 Semaphore의 차이점과 사용방법  (0) 2019.01.03
    화면 캡쳐와 Printwindow 함수  (6) 2019.01.02
    뮤텍스란?  (2) 2019.01.02

    댓글

Designed by Tistory.