SendMessageCallback
SendMessageCallback
SendMessage() 는 쓰레드에서 충돌 문제로 PostMessage() 를 사용했으나 메시지 전송이 보장되지 않는 문제가 있어 SendMessageCallback() 를 사용한다.
주의>
다른 프로세스에는 메시지 처리가 보장되지만, 같은 프로세스에서는 안된다는 말이 있네..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=835206&ref=835188
메시지를 받을 윈도의 프로세스가 서로 다른경우라면 비동기로 동작하여 질문하신 내용으로
바로 적용가능합니다...
하지만 메시지를 받을 윈도의 프로세스가 동일한 경우라면 동기식으로 동작하기 때문에
적용이 안됩니다.. 이경우라면 역시 메시지를 받을 함수가 스레드 또는 메시지펌프 같은 방식으로
구현하지 않는한 대안이 없을 듯 하군요...
아래 코드 29번행에서 SendMessageCallBack() 호출하면 SenMessage() 처럼 처리될때까지 기다리지 않고 메시지를 전송하고 바로 반환되어 다음 명령을 실행한다. 메시지처리가 끝나면 등록한 콜백함수(7번행)를 수행하도록 시스템에 부탁한다.
(http://blog.naver.com/PostView.nhn?blogId=chc3484&logNo=100204036924)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 |
BEGIN_MESSAGE_MAP(CMFCApplication7Dlg, CDialogEx)
...
ON_MESSAGE(WM_USER + 100, &CMFCApplication7Dlg::OnCallBackTest)
END_MESSAGE_MAP()
void CALLBACK MultipleMsgCallback(HWND hWnd, UINT uMsg, ULONG_PTR dwData, LRESULT lResult)
{
AfxMessageBox(TEXT("2. MultipleMsgCallback..."));
/*
CSendMultipleMsgDlg* pMsgDlg = (CSendMultipleMsgDlg*)dwData;
switch (uMsg)
{
case WM_MULTIPLE_MSG1:
if (pMsgDlg)
pMsgDlg->SetText1(_T("TestDlg1 완료"));
break;
case WM_MULTIPLE_MSG2:
if (pMsgDlg)
pMsgDlg->SetText2(_T("TestDlg2 완료"));
break;
}
*/
}
BOOL CMFCApplication7Dlg::OnInitDialog()
{
...
SendMessageCallback(GetSafeHwnd(), WM_USER + 100, WPARAM(1), LPARAM(2), MultipleMsgCallback, (ULONG_PTR)this);
return TRUE;
}
LRESULT CMFCApplication7Dlg::OnCallBackTest(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox(TEXT("1. OnCallBackTest...."));
return 0L;
} |
cs |
<실행 결과> 아래 그림처럼 순서대로 창이 뜬다.
아래 그림과 같이 SendMessageCallback() 로 받은 메시지를 먼저 처리한 다음 메시지 처리가 되었다는 확인용으로 CALLBACK 함수인 MultipleMsgCallback()가 시스템으로 부터 자동 호출된다.
작업을 CALLBACK 함수내에서 처리해도 된다.