【问题标题】:Correctly handling custom messages using WTL使用 WTL 正确处理自定义消息
【发布时间】:2010-12-14 13:19:21
【问题描述】:

我编写了一个多线程 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);
}

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

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

【问题讨论】:

    标签: message-queue wtl


    【解决方案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); 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2016-02-10
      • 2013-07-05
      相关资源
      最近更新 更多