'타이머'에 해당되는 글 8건

  1. 2010.07.19 WinApi 타이머 콜백함수
  2. 2010.07.19 WinApi 타이머 [백그라운드 작업]
posted by nsakura 2010. 7. 19. 14:20

위의 예제는 타이머 메세지를 사용했지만.

콜백 함수를 이용하여 사용이 가능한데.

우리가 타이머를 처음 배울때 SetTimer인자중 4번째 인자를 사용하면 되는데.

즉 시간을 지장해놓고 4번째 인자를 설정하면 그 함수가 호출이 된다.

그럼 4번째 인자에 함수를 만들어서 넣으면 되겠네? 라고 생각하면 되는데.

그게 좀 정해진 원형이 있다. 참으로 하쉽다.

다음 원형에 맞춰서 만들어야 된다. [이름은 자기 마음대로 하지만 그냥 주어진대로 쓰는게 프로그램 만들때 편할지도]

VOID CALLBACK TimerProc(HWMD hWnd,UINT uMsg, UINT idEnvent, DWORD dwTime);

첫 번째 인수 타이머를 소유한 윈도우의 핸들

두번째 인수는 WM_TIMER를

idEvent는 타이머의 ID

dwTime은 윈도우즈가 실행된 후의 경과 시간이다.

이 함수의 인수는 잘 사용되지는 않는다고 하자.

그럼 코드를 바꿔보자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD); //함수 선언

HINSTANCE g_Inst;

LPCTSTR wndName=TEXT("BACKGROUND");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevINSTANCE,LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=wndName;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndName,wndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
 
 ShowWindow(hWnd,nShowCmd);
 
 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,LPARAM lParam){
 HDC hdc;
 switch(iMessage){
 case WM_CREATE:
  SetTimer(hWnd,1,50,TimerProc);
  return 0;
 case WM_LBUTTONDOWN:
  hdc=GetDC(hWnd);
  Ellipse(hdc,LOWORD(lParam)-10,HIWORD(lParam)-10,LOWORD(lParam)+10,HIWORD(lParam)+10);
  ReleaseDC(hWnd,hdc);
  return 0;
 case WM_DESTROY:
  KillTimer(hWnd,1);
  PostQuitMessage(0);
  return 0;

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


VOID CALLBACK TimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime){   //함수 정의
 HDC hdc;
 hdc=GetDC(hWnd);
 int cnt;
 for(cnt=0; cnt<1000; cnt++){
  SetPixel(hdc,rand()%500,rand()%500,RGB(rand()%256,rand()%256,rand()%256));
 }
 ReleaseDC(hWnd,hdc);
}

그럼 도데체 콜백 함수가 무엇인가?

몇번 이야기를 했지만 다시하번 알아보자.

일반적으로 API함수는 프로그램 내에서 운영체제에게 "저기 이거 좀 필요한데요"라고 말을 하는 식이다.

그런데 콜백 함수는 반대이다. 운영체제가 프로그램내의 함수를 호출하는거다 "야 그거 내놔" 식인거다.

그래서 콜백 함수이다.

'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 확장 2  (0) 2010.07.19
WinApi 타이머 확장  (1) 2010.07.19
WinApi 타이머 [백그라운드 작업]  (0) 2010.07.19
WinApi 두개의 타이머  (0) 2010.07.18
WinApi 타이머 확장 문제.  (0) 2010.07.18
posted by nsakura 2010. 7. 19. 13:45

 쌩뚱 맞게 바로 시작하겠다.

 게임을 한번 생각해보자. 게임의 배경이 바뀐다던가 음악이 바뀐다. 하는건 게임이라면 어느 게임이든 다 있다.

심지어 8비트 게임에서도 조차에서도 배경은 바뀌고 음악은 바뀐다.

예를 게임에 든것이고 실재로 많은 프로그램에서도 백그라운드 작업은 한다.

오늘은 백그라운드 작업에 대해 알아보자.

#include <windows.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE g_Inst;

LPCTSTR wndName=TEXT("BACKGROUND");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevINSTANCE,LPSTR lpCmdLine,int nShowCmd){
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_Inst=hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=wndName;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW|CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(wndName,wndName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
 
 ShowWindow(hWnd,nShowCmd);
 
 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;

}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage, WPARAM wParam,LPARAM lParam){
 HDC hdc;
 int cnt;

 switch(iMessage){
 case WM_CREATE:
  SetTimer(hWnd,1,50,NULL);
  return 0;
 case WM_TIMER:
  hdc=GetDC(hWnd);
  for(cnt=0; cnt<1000; cnt++){
   SetPixel(hdc,rand()%500,rand()%500,RGB(rand()%256,rand()%256,rand()%256));
  }
  ReleaseDC(hWnd,hdc);
  return 0;
 case WM_LBUTTONDOWN:
  hdc=GetDC(hWnd);
  Ellipse(hdc,LOWORD(lParam)-10,HIWORD(lParam)-10,LOWORD(lParam)+10,HIWORD(lParam)+10);
  ReleaseDC(hWnd,hdc);
  return 0;
 case WM_DESTROY:
  KillTimer(hWnd,1);
  PostQuitMessage(0);
  return 0;
 }
 return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}


간단한 프로그램이다 .

settimer에 설정된 시간이 되면 점을 반목문의 조건만큼 만든다.

그리고 마우스 왼쪽 버튼을 누르면 그 지점에 원을 그린다.

그런데 왜 반복문에 조건식이있는가 백그라운드 작업이면 무한루프를 돌려도 되지 않는가?

그건 아니다. 쓰래드를 돌린것이 아니기 때문에 어느정도 갭을 줘야한다.

무한루프를 돌려버리면 반복문에서 빠져나올수가 없는 것 이다.

궁금하면

무한루프 돌려보길 바란다..

원을 찍긴 커녕 프로그램이 바보가 될것이다.

'Computer > Win API' 카테고리의 다른 글

WinApi 타이머 확장  (1) 2010.07.19
WinApi 타이머 콜백함수  (0) 2010.07.19
WinApi 두개의 타이머  (0) 2010.07.18
WinApi 타이머 확장 문제.  (0) 2010.07.18
WinApi 타이머2 [SendMessage]  (0) 2010.07.18