Я написал многопоточный 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 любить знать правильный путь - может кто-то помочь !?