Last Updated 2005/01/11
Programming Tips Visual C++ MFC スレッド  索 引 
スレッドの終了
2005/01/11

ユーザーインターフェイススレッドを終了させるには PostThreadMessage() にて WM_QUIT を送信するとよい.(ウィンドウがなくてもメッセージ処理可能である)

スレッドへのメッセージ送信でも WM_USER からのオフセットを使用しなければならない.(この辺はウィンドウに対するメッセージ送信と同様である)
試しにメッセージ ID を 1 にして送信しても処理されない.
(メッセージ ID 1 は WM_CREATE と同じ値である)
(ちなみに 0 は WM_NULL)

スレッドを WM_QUIT などで終了させた場合,その終了を待つ必要がある.
スレッドが終了する前にメインスレッドが終了してメモリリークする場合があるからである.

終了待ちには WaitForSingleObject() などを使用する.

ちなみにスレッドハンドルにて終了コードを取得する場合,GetExitCodeThread()
を使用するが,スレッドハンドルをそのまま渡すと例外が発生する.
DuplicateHandle() でスレッドハンドルをコピーしてから GetExitCodeThread() しなければならない.


スレッドを終了するコードは以下の通りである.

  int CTestApp::ExitInstance() 
  {
      ::PostThreadMessage(m_pThread->m_nThreadID, WM_QUIT, 0, 0);
      ::WaitForSingleObject(m_pThread->m_hThread, INFINITE);

//    delete m_pThread; セカンダリスレッドの m_bAutoDelete を FALSE
//                      にしている場合はこれを実行

      return CWinApp::ExitInstance();
  }


スレッドの m_bAutoDelete を FALSE にしておけば,スレッドハンドルを複製する必要はない.その代わり自分で delete する.


参照
前後のTips
スレッドの終了

DSS ProgrammingTipsCGI Ver2.02