OS/Windows API

#6 Windows API Timer

VallistA2014. 8. 26. 10:39

첨부파일 : (API 기본 베이스 + Timer)


APILibrary.zip




Windows API에서 우리가 실시간으로 시간을 받고 여러가지를 컨트롤을 수시로 하고 싶을 때가 있을 것 입니다.

그럴때 우리는 어떻게 할까요? 

API에서 기본적으로 보이는 LRESULT 와 WinMain에서 해결을 할 수 있을까요?

정답은 반 정도 YES 입니다.


자 Timer에 대해서 이제부터 알아보도록 하겠습니다.


함수 원형


SetTimer(

    _In_opt_ HWND hWnd,

    _In_ UINT_PTR nIDEvent,

    _In_ UINT uElapse,

    _In_opt_ TIMERPROC lpTimerFunc);


먼저 우리는 Timer를 사용하기에 앞서 Windows 에게 Timer를 사용한다고 알려야 합니다.

이러한 작업이 필요한 이유는 Timer가 여러개 존재할 수도 있고 얼만큼의 시간에, 몇번씩 체크할 것인지 알야아 하기 때문이거든요.


SetTimer는 저번 시간에 배운 Init 이라는 함수에서 처리를 해주시면 됩니다. (단 한번만 처리 해주시면 됩니다.)


그리고 이렇게 써주세요

SetTimer(윈도우 핸들, 타이머 번호, 몇초에 한번씩 응답을 할 것인지 (밀리 세컨드), NULL);


첫번째 인자인 윈도우 핸들에는 HWND를 선언한, 우리가 사용하고 있는 핸들 윈도우를 써 넣어 주시면 됩니다.

 이 핸들은 거의 공통적으로 API 관련 모든 함수에서 사용을 하게 됩니다.


두번째 인자인 타이머 번호는 우리가 몇번째 타이머를 쓸지부터 여러가지가 나와 있습니다.

 우리가 업데이트와 시간을 재 주는 것을 각각에 분리를 하게 되면 타이머 번호가 다르겠죠?

 타이머 번호에는 정수가 들어갑니다.


세번째 인자는 몇초에 한번씩 응답할 것인지가 들어가게 됩니다. 이 값은 밀리 세컨드 즉 1000에 1초입니다.

 보통 계속 Loop 할 때에는 10을 써놓고 사용을 합니다.

 이 값이 프로그램 Loop에 지대한 영향을 끼칩니다.

 10이 아닌 2000을 쓰게 될 경우에는 2초에 한번씩 반응하는 타이머가 만들어 지겠죠?


네번째 인자는 사용하지 않으므로 NULL을 써 넣어 주시면 됩니다.


각각의 인자를 알고 나서 우리가 사용을 할 때는

SetTimer(hWnd, 0 , 10, NULL); 이런식으로 사용하시면 되겠습니다.


자 SetTimer로 업데이트를 돌려주고 있는데 우리는 그러면 어디서 업데이트 구문을 넣어 주어야 할까요?

어디서 CALLBACK 받는것도 없고.. 어떻게 해야할까요?


정답은 LRESULT에 있습니다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	switch (iMessage)
	{
		case WM_TIMER:
			CMain::GetInstance()->Update(0);
			break;
		case WM_KEYDOWN:
			switch (wParam)
			{
				case VK_ESCAPE:
					CMain::GetInstance()->Destroy();
					PostQuitMessage(0);
				break;
			}
		break;
		case WM_DESTROY:
			CMain::GetInstance()->Destroy();
			PostQuitMessage(0);
			break;
	}

	return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}

이 WndProc에서 보시면 case 로 WM_TIMER가 존재합니다.

case WM_TIMER는 SetTimer로 설정한 Update Loop 가 돌아가는 구문이며, 내부에 써주시면 되겠습니다.


타이머를 시작을 했으면 종료도 있어야겠죠?

KillTimer로 타이머를 죽이면 됩니다. (과격한 표현..)


함수 원형

KillTimer(

    _In_opt_ HWND hWnd,

    _In_ UINT_PTR uIDEvent);


Kill Timer는 우리가 설정해준 Timer를 중지시키는 역할을 하게 됩니다.

사용법은 상당히 간단합니다.


첫번째 인자에서는 똑같은 핸들을 넣어주시면 됩니다.

두번째 인자는 Event ID 값인데요, 아까 SetTimer 할 때의 3번째 인자를 넣어 주시면 되겠습니다.



우리는 Timer를 배워 보았습니다. 어떠신가요?

계속 상황이 변화 함에 따라서 Update도 계속 돌려주어야 하기에 이런게 나온것 같습니다.

유용하게 사용할 수 있겠죠?

댓글

  • Ceeu2019.12.30 15:13 5년도 더 지난 글이지만... KillTimer에 두번째 인자는 SetTimer의 2번째 인자로 알고 있는데 3번째 인자로 되있네요
댓글쓰기 폼

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.

자고 싶습니다. ㅠㅠ

페이스북    :: 링크
카카오톡    :: kingbye1
Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today : 18

Total : 341,807

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘