윈도우 프로시져
- 메시지 처리함수
- CALLBACK 함수 -> SendMessage로 간접 호출
- 재진입 가능
- WM_LBUTTONDOWN 처리 중에 WM_PAINT 처리 가능
- 가급적 지역 변수 사용 자제
큐메시지
- 주로 사용자의 입력으로부터 발생되는 메시지
비큐메시지
- 메시지 큐에 들어가지 않고 곧바로 윈도우 프로시저로 보내지는 메시지
- 대부분의 윈도우즈 메시지
시스템 메시지 큐
- 시스템 전체에 유일한 메시지 큐
쓰레드 메시지 큐
시스템 메시지 큐 -> 쓰레드 메시지 큐 -> 윈도우 프로시져
시스템은 쓰레드를 생성할 때 디폴트로 메시지 큐를 가지지 않는 쓰레드를 만든다.
GetMessage(메시지, 윈도, 필터맥스, 필터민)
- 메시지 큐에서 메시지 제거하고 TRUE 리턴
- WM_QUIT이면 FALSE 리턴
- 나머지 인자들은 메세지를 골라서 가져오는 필터링에 사용
- 윈도핸들 -> 특정 윈도와 차일드용 메시지만, 널값이면 현재 쓰레드 속한 모든 윈도우 메시지
- 새로운 메시지가 들어올 때까지 리턴 하지 않음
- 무한대기 -> 한가롭게 놀고 있다.(데드타입)
PeeKMessage()
- 메시지가 있다 -> TRUE 리턴
- 메시지가 없다 -> FALSE 리턴
- 즉시리턴 -> 메시지가 없을 때 다른 일 가능
for(;;) {
if(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
if(Message.message == WM_QUIT) break;
TranslateMessage(&Message);
DispatchMessae(&Message);
}
else {
Other Work..........
}
}
PostMessage(HWND hWnd, UINT message)
- hWnd의 메시지 큐에 집어 넣음
- 언제 처리 될지 에측 힘듦
- 자신의 쓰레드 메시지 큐에 메시지를 집어 넣는다.
PostMessageThread()
- 다른 쓰레드의 메시지 큐에 메시지를 넣을 수 있다.
* SendMessage() 는 메시지큐를 거치지 않고 메시지를 전달한다.
- SendMessage()는 메시지를 전달하고 리턴을 할때까지 블럭된다.
메시지데드락
- SendMessage()는 윈도우 프로시져가 리턴하기 전까지는 리턴하지 않음
- 일종의 명령 -> 서브 루틴 호출과 대등
* SendMessage()를 같은 쓰레드 내의 윈도우 끼리 메시지를 주고 받을 때는 데드락이 발생하지 않는다.
-> 메시지 박스의 메시지 펑핌에 의해 가능
-> 반면 서로 다른 윈도우라면 SendMessage()를 했을 시 블럭이 된다.
- 해결방법
- ReplayMessage() : 메시지를 받은 쪽에서 즉시 리턴해주고 다음 작업을 계속하는 것
- SendNotifyMessage() : Notify메시지 전용
- SendMessageTimeout() : 타임을 걸어서 그 시간내에 응답이 없으면 리턴하여 계속 처리
- SendMessageCallback()
- 상대방에게 메시지를 보냈을 때 상대방이 작업을 제대로 수행했는지 결과가 필요하거나 상대방이 작업을 끝냈을 때,
다른 처리할 일이 있는데, 내가 블럭이 되고 싶지 않을 때 사용.
-> CallBack 함수를 만들어서 상대방이 작업이 처리하고 나서 리턴하면 내가 만들어 넣은 CallBack 함수를 호출한다.
브로드캐스팅
- 실행중인 모든 윈도우에게 메시지ㄹ 방송
- 모든 프로세스가 영향을 받는 중대한 변화가 생겼을 때 (예, 장치추가)
'API' 카테고리의 다른 글
스레드 V의 노트 (0) | 2008.08.15 |
---|---|
- 윈도 프로그램의 시작과 끝. "Message" - (0) | 2008.08.15 |
## SendMessage & PostMessage ## (0) | 2008.08.15 |
함수,변수 표기법(헝가리안) (2) | 2008.08.15 |
레지스트리 쓰기, 삭제 함수 (1) | 2008.08.13 |
#if defined(_UNICODE) || defined(UNICODE) 디파인 or 연결시 (0) | 2008.08.08 |
DialogBoxIndirect 샘플 수정 및 코딩 최적화 작업 (1) | 2008.08.06 |