我编写了一个多线程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永远不会被调用。
我可以处理它的唯一方法是在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);
}
我确定这不是正确的做法......
我想知道正确的方法 - 有人可以帮忙吗??
答案 0 :(得分: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);
}