2009-11-09 3 views
1

Я написал многопоточный WTL для стресс-тестирования собственного сервиса.Правильное обращение с пользовательскими сообщениями с использованием WTL

Коммуникационные потоки сообщают основной теме, что они ушли, поэтому основной поток может удалить соответствующий объект.

Они делают сигнал как так:

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 никогда не вызывается.

Единственный способ, которым я могу справиться с этим является вызовом обработчика явно PreTranslateMessage:

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); 
} 

Я уверен, что это не правильный способ сделать это ...

Я d любить знать правильный путь - может кто-то помочь !?

ответ

1

Как указано в docСообщения, отправленные PostThreadMessage, не связаны с окном. Как правило, сообщения, которые не связаны с окном, не могут быть отправлены функцией DispatchMessage.

Установите HWND в pMsg-> 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^