2009-11-09 5 views
1

저는 사내 서비스 스트레스 테스트를 위해 멀티 스레드 WTL 유틸리티를 작성했습니다.WTL을 사용하여 사용자 정의 메시지를 올바르게 처리하기

Comms 스레드가 종료 한 주 스레드로 신호를 보내면 주 스레드가 해당 개체를 삭제할 수 있습니다.

그들은도록 신호를합니다

PostThreadMessage(m_dwParentThreadId, WM_THREADQUIT, 1, m_dwNetThreadId); 

내 문제는 내가 정의한 사용자 지정 메시지를 처리하는 방법입니다.

WM_THREADQUIT is #define'd as WM_USER + 10 

나는
BEGIN_MSG_MAP(CMainDlg) 
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) 
    MESSAGE_HANDLER(WM_THREADQUIT, OnThreadQuit) 
    ... 
    REFLECT_NOTIFICATIONS() 
END_MSG_MAP() 

그러나, OnThreadQuit가 호출되지 않습니다 :, 예컨대을 핸들러를 호출하는 메시지 맵에 항목을 사용하고 싶었다.

나 '...이 그것을 할 올바른 방법이 아니다 확신

virtual BOOL CMainDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    if(pMsg->message == WM_THREADQUIT) 
    { 
    BOOL blHandled; 
    OnThreadQuit(pMsg->message, pMsg->wParam, pMsg->lParam, blHandled); 
    return TRUE; 
    } 
    return CWindow::IsDialogMessage(pMsg); 
} 

을 : 나는 그것을 처리 할 수 ​​

있는 유일한 방법은를 PreTranslateMessage에서 명시 적으로 핸들러를 호출하는 것입니다 d는 올바른 길을 알고 싶어 - 누군가 도와 줄 수 있니?

답변

1

doc에서 보낸 메시지는 PostThreadMessage와 관련이 없습니다. 일반적으로 창과 관련이없는 메시지는 DispatchMessage 함수에 의해 발송 될 수 없습니다.

는 pMsg-> HWND에 HWND를 설정하고 :: DispatchMessage()는 당신의 WndProc로 배달합니다 :

virtual BOOL CMainDlg::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_THREADQUIT) 
    { 
    pMsg->hwnd = m_hWnd; 
    return FALSE; // continue processing 
    } 
    return CWindow::IsDialogMessage(pMsg); 
} 
관련 문제