CMyView::OnDestroy()
...
{ m_pMyThread -> PostThreadMessage (WM_QUIT, 0 , 0 ); // a work thread with UI pump DWORD ret; bool quit = false ; int quitwparam = 0 ; bool bThreadEnd = false ; do ... { ret = ::MsgWaitForMultipleObjects( 1 , & m_hThread, FALSE, INFINITE, QS_ALLINPUT); if (ret != WAIT_OBJECT_0) ... { MSG msg; while (::PeekMessage ( & msg, NULL, 0 , 0 , PM_NOREMOVE)) ... { // do not feed WM_QUIT into the message pump! if (WM_QUIT == msg.message) ... { GetMessage( & msg, 0 , 0 , 0 ); // do not feed WM_QUIT into the message pump! quit = true ; quitwparam = ( int )msg.wParam; } else ... { VERIFY(AfxGetApp () -> PumpMessage ()); } // if(WAIT_OBJECT_0 == WaitForSingleObject(m_hThread, 0)) // { // bThreadEnd = true; // break; // } } } } while ((ret != WAIT_OBJECT_0) && (ret != WAIT_FAILED)); if (quit) PostQuitMessage(quitwparam); VERIFY(CloseHandle(m_hThread)); m_hThread = 0 ; }
Refer to:
First Aid for the Thread-Impaired: Using Multiple Threads with MFC
More First Aid for the Thread Impaired: Cool Ways to Take Advantage of Multithreading
Waiting for a thread to terminate