-
[MFC] PostMessage() 와 SendMessage()의 차이점Programming/API & MFC 2015. 2. 24. 16:45
BOOL PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
두 함수의 인수는 완전히 동일합니다. 여기서 Post라는 말은 우리말로 "붙인다"라고 번역되며 "Send"라는 말은 "보낸다"라고 번역됩니다.
PostMessage 함수는 Msg인수로 지정된 메시지를 hWnd 윈도우의 메시지 큐에 집어넣어 윈도우 프로시저에서 이메시지를 처리하도록합니다. 메시지를 큐에 넣기만 하고 바로 리턴하므로 메시지를 붙인 후 즉시 다른 작업을 할 수 있지만 큐에 대기하고 있는 다른 메시지가 있으면 뒤에 붙인 메시지는 곧바로 처리되지 않구요. 큐에 붙여진 메시지는 GetMessage에 의해 읽혀지고 DispatchMessage에 의해 윈도우 프로시저로 보내져 처리될 겁니다.
급하게 처리할 필요가 없거나 또는 지금 하고 있는 작업을 완전히 끝내야만 처리할 수 있는 메시지는 PostMessage함수로 큐에 붙이구요. 이함수로 붙여진 메시지는 언제 처리될지 정확하게 예측하기 힘들구요. 그래서 붙여지는 메시지늬 wParam과 lparam에는 지역포인터를 사용지 말아야 해요. 메시지를 붙일 시점에는 포인터가 존재했더라도 메시지가 처리될 시점에는 포인터가 무효해질 수 있기 때문이죠.PostMessage는 메시지를 큐에 붙인 후 성공하면 TRUE를 리턴하며 실패하면 FALSE를 리턴하는데 메시지 큐는 크기가 한정되어 있기 때문에 고속으로 전송되는 모든 메시지를 다 수용하지 못 할 수도 있어요. 다행히 Win32환경에서는 큐 크기가 대폭 늘어나서 웬만해서는 큐가 부족한 상황이 잘 발생하지 않아요.
SendMessage는 메시지를 큐에 넣는 것이 아니라 곧바로 윈도우 프로시저로 보내 즉각 처리하도록 하며 메시지가 완전히 처리되기 전에는 리턴하지 않죠. 즉 블록시켜서 SendMessage는 윈도우간 특히 부모 윈도우와 차일드 컨트롤간의 통신에 자주 사용되구요. 예를 들어 리스트 박스에 LB_ADDSTRING 이라는 메시지를 보내면 이는 리스트 박스에 문자열 항목을 추가하라는 명령이 되며 항목이 완전히 추가되고 난 후에 SendMessage가 리턴되죠.
윈도우간에 메시지를 교환할 때 어떤 함수를 사용할 것인가는 신중하게 결정해야 하는데 대부분의 경우는 SendMessage로 보내는 것이 정석이며 또 효율적이죠. 또 WM_COPYDATA같은 메시지는 그 특성상 반드시 SendMessage로만 보내야 하며 PostMessage로 붙여서는 안되요.
즉 정리하자면 SendMEssage는 당장 어떤 일을 하라는 명령이며, PostMessage는 한가해질 때 어떤 일을 하라는 신호죠.
부가하자면 PostMessage는 큐에 넣고, SendMessage는 WndProc의 case 하나를 호출하는 것과 같아요.
극히 책을 참조하여 객관적으로 적었기 때문에 제 주관적인 느낌이나 내용은 극히 없으므로,
틀린 내용이 있다면 지적하여도 무방합니다.
출처: http://ssmhz.tistory.com/18
'Programming > API & MFC' 카테고리의 다른 글
[MFC] 릴리즈 모드에서 디버깅 하는 방법 (0) 2015.02.24 [MFC] 기초 문법들 (0) 2015.02.24 MFC 헤더와 라이브러리 설명 (0) 2014.03.26