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;
}
... {
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