336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

PostMessage , SendMessage 쓰레드간 메시지 주고받을때, 동기화


PostMessage (in "pure windows programming", aka win32 API) is asynchronous, i.e., to quote the docs:

Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

To post a message in the message queue associated with a thread, use the PostThreadMessage function.

SendMessage is synchronous, that is, again quoting:

Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.

To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function. To post a message to a thread's message queue and return immediately, use the PostMessage or PostThreadMessage function.

A good tutorial on these two functions and their use is here.

The connection to WPF is discussed in this SO question.



PostMessage 는 메세지 큐에만 넣어주고 메세지 처리 까지는 기다리지 않기 때문에 비동기 처리, 보낸 순서와 메세지 처리 끝나는 시점이 순서가 맞지 않을 수 있다.



SnedMessage 는 메세지 큐에만 넣어주고 메세지 처리 까지 기다리기 때문에 동기 처리, 하나의 메세지가 다 처리되고나서 다음 메세지가 처리된다.




336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL 프로젝트에서 hWnd사용하기




문제 상황 : 


ATL 프로젝트에서


소켓 통신을 위한 쓰레드를 만들어 사용하다


소켓 통신 도중 특정 메시지 수신시


ATL 이벤트를 발생 시키고 싶었다.


------요약-----------


Worker Thread 에서 ATL event(Fire_xxxx) 실행



직접 Fire 함수를 실행시 Invoke 부분에서


E_UNEXPECTED Catastrophic failure. 를 리턴한다.



Worker Thread 에서 ATl main Thread 의 함수를 실행하여 그런것 같다.



SendMessage 나 PostMessage 로 Main Thread 가 실행하도록 메시지를 주는 방법을 찾던 도중


SendMessage가 hWnd 를 이용하여 타 쓰레드간 메시지를 주고 받을수 있다는 점을 활용하였다.



하지만 기본 ATL 객체는 hWnd 를 갖고 있지 않다.



생성자 호출 시


상속 받은 m_bWindowOnly 변수를 TRUE 로 초기화하면 


m_bWindowOnly = TRUE;



상속 받은 m_hWndCD 를 사용 할 수 있다.


m_hWndCD를 활용하여 WorkerThread 에서


메인 쓰레드로 메세지를 준다.



::SendMessage(pHelloCtrl->m_hWndCD, WM_xxx, (WPARAM)NULL, (LPARAM)NULL);




추가-------

혹시나 메인 쓰레드에서 메세지를 받는 방법을 모르는 사람이 있을까 싶어서 추가합니다.

일반 MFC 는 이런 메세지 맵을 갖고 있는데

BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()


ATL 프로젝트는


BEGIN_MSG_MAP(xxxxxx)
MESSAGE_HANDLER(WM_CODE_START, OnSTART)
MESSAGE_HANDLER(WM_CODE_STOP, OnSTOP)
CHAIN_MSG_MAP(CComControl<xxxxxxxx>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

이런 메세지 맵을 갖고 있습니다.



여기에 SendMessage 로 받을 메세지를 선언하고 그 때 실행할 함수를 위치시키면 됩니다.




ATL 프로젝트에서 hWnd사용하기

Programming/COM,ATL 2016. 3. 25. 11:19 Posted by TanSanC
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ATL 프로젝트에서 hWnd사용하기




문제 상황 : 


ATL 프로젝트에서


소켓 통신을 위한 쓰레드를 만들어 사용하다


소켓 통신 도중 특정 메시지 수신시


ATL 이벤트를 발생 시키고 싶었다.


------요약-----------


Worker Thread 에서 ATL event(Fire_xxxx) 실행



직접 Fire 함수를 실행시 Invoke 부분에서


E_UNEXPECTED Catastrophic failure. 를 리턴한다.



Worker Thread 에서 ATl main Thread 의 함수를 실행하여 그런것 같다.



SendMessage 나 PostMessage 로 Main Thread 가 실행하도록 메시지를 주는 방법을 찾던 도중


SendMessage가 hWnd 를 이용하여 타 쓰레드간 메시지를 주고 받을수 있다는 점을 활용하였다.



하지만 기본 ATL 객체는 hWnd 를 갖고 있지 않다.



생성자 호출 시


상속 받은 m_bWindowOnly 변수를 TRUE 로 초기화하면 


m_bWindowOnly = TRUE;



상속 받은 m_hWndCD 를 사용 할 수 있다.


m_hWndCD를 활용하여 WorkerThread 에서


메인 쓰레드로 메세지를 준다.



::SendMessage(pHelloCtrl->m_hWndCD, WM_xxx, (WPARAM)NULL, (LPARAM)NULL);