1

社内サービスのストレステストを行うために、マルチスレッドのWTLutilを作成しました。

通信スレッドは、終了したことをメインスレッドに通知するため、メインスレッドは対応するオブジェクトを削除できます。

彼らはそのように信号を出します:

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

これは正しい方法ではないと確信しています...

私は正しい方法を知りたいです-誰かが助けることができます!?

4

1 に答える 1

1

ドキュメント に記載されているように、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); 
}
于 2010-03-06T00:12:08.997 に答える