Re: How to current close window while messages still in queue
"Scott McPhillips [MVP]" <org-dot-mvps-at-scottmcp> wrote in message
news:%23xm%23aBrPJHA.4084@TK2MSFTNGP04.phx.gbl...
"vvf" <vvf@vvf.com> wrote in message
news:e1$cRYqPJHA.5080@TK2MSFTNGP03.phx.gbl...
Hi All,
for (int i = 0; i <= iUpperBound && (WaitForSingleObject(m_hQuitEvent,
0) == WAIT_TIMEOUT); ++i)
{
/../
// Construct data, etc...
CData* pData = new CData; // pseudocode
PostMessage(UpdateMessage, (WPARAM)pData, ... ) // Update the
GUI and delete pData
}
After the for loop is over, the thread function just finishes and this
thread ends. The m_hQuitEvent is there so that I can set it if I want to
abort the processing.
Here is how the message handler looks like:
LRESULT CWhateverDialog::OnUpdateMessage(WPARAM wParam, ...)
{
CData* pData = (CData*)wParam;
// update GUI control w/ pData information
delete pData;
return 0;
}
The WaitForSingleObject in your main thread stops all message processing.
So don't do that. What you can do is ask the secondary thread to end in
OnOK, and DO NOT call CDialog::OnOK there. Then have the secondary thread
PostMessage(MSG_OkToQuit, ... ) as the last thing it does before exiting.
The message handler for MSG_OkToQuit can call CDialog::OnOK().
OK, I solved the problem. Thanks for pointing to the "WaitForSingleObject"
in the GUI there. I just moved it to the thread that posts the message to
quit. Before it posts the message, it waits on the other thread to finish,
deletes it and the posts the message to quit. In that handler, I do the
CDialog::OnOK().
Thanks for your advice and solution,
vvf