본문 바로가기

예전/API

[API] Message Deadlocks ( 메시지 데드락 )


메시지 데드락


메시지 데드락은 메시지의 교착상태이다.


 데드락이란 프로세스들의 집합이 더 이상 진행을 못하고 블록이 되어있는 상태로 시스템자원에 대한 경쟁도중에 발생할 수도 있고, 프로세스간 통신중에 발생한다.

서로 충돌이 되는 자원을 요구하기 때문에 데드락이 발생한다. 


SendMessage함수는 메시지를 받은 윈도우 프로시저를 리턴하기 전에는 리턴하지않는다.

SendMessage 호출은 서브루틴 호출과 대등하며 실제로 WndProc case 하나를 호출하는 것과 같다.

만약 SendMessage 받은 대상이 어떠한 이유로 10 후에 반환을 하게 되었다면 메시지를 보낸 대상은

10초간 데드락 상태에 빠지게 되어 어떠한 것도 없는 상태가 되어버린다



해결 방법 


메시지가 다른 스레드로 부터 전달되었을 때는 즉시 리턴한 후 다른 작업을 계속 하는 것이다. 메시지가 다른 스레드로왓는지 InSendMessage 함수로 조사하여 다른 스레드로부터 것이면 TRUE 리턴한다.


InSendMessage 는 조사만 하는 것이고 일단 조사하고나서 바로 리턴해야하는데 그 리턴하는 함수가

BOOL ReplyMessage(LRESULT lResult);   함수이다.

메시지를 받은 쪽에서 이 함수를 호출하면 SendMessage를 호출한 윈도우는 즉시 다른 일을 할 수 있다.




다른 방법은 메시지를 보내는 윈도우에서 다른 윈도우로 보낼때 SendMessage 대신 다른 함수를 사용하는 것이다.



BOOL SendNotifyMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);


LRESUlT SendMessageTimeout(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags, UINT uTimeout, PDWORD_PTR lpdwResult);


SendNotifyMessage SendMessage 와 유사하나 윈도우 핸들이 다른 스레드의 윈도우일 경우는 대기를 하지 않고 즉시 리턴한다이 함수는 메시지가 단순한 통시의 성격을 가지고 있을 때, 즉 끝까지 처리되기를 기다릴 필요가 없을 때 사용한다.


SendMessageTimeout 함수는 지정한 경과 시간 이상이 지나면 메시지의 처리 여부에 상관없이 즉시 리턴함으로써 메시지를 보낸 윈도우가 무한히 대기하지 않게 한다.


다른 방법은 , SendMessgageCallback 함수를 이용하여 해결하는 방법이다.

ReplyMessage()함수는 단지 메시지를 받은 프로시저에서 호출할때, 인수로 TRUE 또는 FALSE 값을 지정하면 메시지를 보낸 프로시져로 바로 리턴한다

SendMessageCallback()함수는 기존의 메시지를 주고 받는 두개의 프로시져 사이에 또 다른 콜백 함수를 지정하여 메시지 처리 상황은 콜백 함수에 넘겨주고, 메시지를 보낸프로시져는 자신의 작업을 계속 할 수 있도록 한다.










[참고 및 출처] [13장] 메시지 - 메시지 통신 , PostMessage , SendMessage , 메시지 데드락 , InSendMessage , ReplyMessage , |작성자 어른아이


[참고 및 출처http://blog.naver.com/kkan22/80057888256



'예전 > API' 카테고리의 다른 글

[API] IME에서 좌상단에 네모칸 없애기  (0) 2012.11.19
[API] 프로세스  (0) 2012.10.22
[API] LRESULT 와 HRESULT  (0) 2012.06.28
[API] 모달 과 모달리스의 차이 (modal modeless)  (0) 2012.06.27
[API] Virtual Key Value  (0) 2012.05.13