Saturating message queue?
I was interested in timing how long it took for a parent and child thread to
exchange a series of window messages. I thought I would start with the Frame
and View in the main thread of a doc/view sdi app for simplicity.
I set up a menu item to initiate a loop. Then the Frame and View exchange a
token until the token is incremented to a certain value. However, it hangs
if I use a token value of more than 20. Am I doing something wrong? Is
"SendMessageToDescendants" an inappropriate choice? Is the message queue
"saturating"? ... which would seem odd since the app is using "SendMessage"
rather than "PostMessage"?
// MainFrame handles menu command to initiate
void CBbMainFrame::OnTimeMessaging()
{
SendMessageToDescendants(UWM_BB_FRAME_TO_VIEW, 1, 0);
}
// View handles message and checks token value
// 20 or less is ok, hangs with 21
LRESULT CBbView::OnBbFrameToView(WPARAM token, LPARAM)
{
TRACE1("View:FrameToView %d\n", token);
if (token == 1) {
HiResTimerStart(); // Uses QueryPerformanceCounter
}
if (token < 20) {
m_pFrame->SendMessage(UWM_BB_VIEW_TO_FRAME, token, 0);
}
else {
double elapsed = HiResTimerElapsedMillis();
CString csMsg;
csMsg.Format("20 loops Token: %d elapsed: %.3f\n", token, elapsed);
AfxMessageBox(csMsg);
}
return 0;
}
// Frame handles message, increments token, and sends another message
LRESULT CBbMainFrame::OnBbViewToFrame(WPARAM token, LPARAM)
{
TRACE1("Frame:ViewToFrame Token: %d\n", token);
SendMessageToDescendants(UWM_BB_FRAME_TO_VIEW, (token+1), 0);
return 0;
}