본문 바로가기

Hello CE,Mobile

SendMessage() 와 PostMessage() 차이

##############################################################################
PostMessage= 리턴 메시지가 와야 실행
SendMessage = 리턴 메시지를 받지 못해도 실행(바로 실행)
###############################################################################
PostMessage의 경우 윈도우의 메시지 큐에 메시지가 들어게가 되고, 윈도우 프로시저에게 이

메시지를 처리하도록 한다. 메시지를 큐에 넣기만 하고 바로 리턴하므로 메시지를 붙인 후 즉시 다

른 작업을 할 수 있게 되지만 큐에 대기하고 있는 다른 메시지가 있으면 뒤에 붙인 메시지는 곧바

로 처리 되지 않는 특징을 가지고 있다. 큐에 붙여진 메시지는 GetMessage에 의해 읽혀지고,

DispatchMessage 함수에 의해 윈도우 프로시저로 보내어져 처리가 된다.

SendMessage는 메시지를 큐에 넣는 것이 아니라 곧바로 윈도우 프로시저로 보내 즉각 처리 하

도록 하며 메시지가 완전히 처리되기 전에는 리턴하지 않고, 블록 시켜서 대기 상태로 만든다.

정리해 보면, SendMessage는 메시지를 바로 처리하고, PostMessage는 메시지 대기 큐에 넣

어서 처리를 하는 것이다.

SendMessage의 동작 과정에 대해 알아보도록 하겠다. SendMessage()를 호출한 스레드와 메

시지를 받는 윈도우를 생성한 스레드가 같다면 실제로 SendMessage()는 직접 윈도우 프로시저

를 호출한 것과 크게 다르지는 않다.
하지만 다른 스레드가 생성한 윈도우에게 보내는 경우라면 다음과 같은 단계를 거치게 된다.

1. 메시지를 받는 윈도우를 생성한 스레드의 Sent Message queue 에 메시지가 추가된다.
( 이는 QS_SENDMESSAGE 플레그를 세팅한 효과를 가지는 것이다.)
2. 받는 스레드가 다음 번 메시지를 받아올 준비가 되었을 때, QS_SENDMESSAGE 플래그가 세팅되어 있다면  Sent Message Queue 에서 메시지를 꺼내어 온다.
3. 메시지 핸들러의 처리가 끝나면 메시지를 보낸 스레드의 Reply Message Queue 에 결과를 추가한다.
4. 메시지를 보낸 스레드는 자신의 Reply Message Queue에 메시지가 들어올 때 까지 기다리고 있게 된다. 이제 새 메시지가 들어왔으므로 넘겨온 값과 함께 SendMessage()를 반환하게 된다. SendMessage함수의 경우 이러한 처리 과정을 거치게 된다.

SendMessage함수의 경우, 윈도우 프로시저가 작업을 끝내게 되면 반환 하도록 되었는데, 이것은 작성하고자 하는 managed code상에서 예상치 않은 익셉션이 발생한다면, 실행 유발하게 된다. 이러한 문제점을 해결하기 위한 함수가 SendNotifyMessage가 있다. 이와 유사한 함수들로, SendMessage Timeout(), SendMessageCallback(), ReplyMessage()가 있다.

SendNotifyMessage()함수에 대해서 msdn에서는 다음과 같이 언급 하였다. 특별한 메시지를 윈도우 혹은 윈도우들에게 보낸다. 만약에 윈도우가 동일 스레드에서 호출되어 생성된다면, SendNotifyMessage는 윈도우 프로시저를 호출하고, 윈도우가 윈도우 메시지를 받아서 처리하는 동안 반환하지 않는다. 하지만, 윈도우가 다른 스레드에게 호출 되면. SendNotfiyMessage는 메시지는 윈도우 프로시저로 보내고, 즉시 반환한다. 이것은 윈도우 프로시저가 메시지의 처리를 끝내기를 기다려 주지 않는다는 의미이다. 이러한 특성 때문에, SendMessage 함수를 사용하는 것보다는 SendNotfiyMessage함수를 사용하는 편이 시스템에 좀더 안정할 것이라 생각되어 진다.

-reference http://blog.naver.com/imanoos/71031797

'Hello CE,Mobile' 카테고리의 다른 글

IsAPIReady()  (0) 2009.12.15
SOURCELIBS 와 TARGETLIBS  (0) 2009.12.14
SendMessage()  (0) 2009.12.11
CreateEvent()  (0) 2009.12.03
윈도우 동기화  (0) 2009.12.02