使用WTL正确处理自定义消息

时间:2009-11-09 08:11:55

标签: message-queue 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永远不会被调用。

我可以处理它的唯一方法是在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);
}

我确定这不是正确的做法......

我想知道正确的方法 - 有人可以帮忙吗??

1 个答案:

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