Processing System Messages
Posted
by Pratap J. Prabhu
on July 22nd, 2003
Environment: VC6
The Requirement
I needed to run a loop in a modal dialog box, but found that although the UpdateWindow() function updated the window (and did not leave me with a White Box on the screen), the buttons onscreen were unresponsive. I searched the Internet and found articles on how to open a dialog in another thread and to keep monitoring the secondary dialog, but was not happy with the solution.
The Solution
I finally came up with a solution to process the dialog box's messages in a function within the dialog box itself. It works great.
My solution consists of adding a function to the existing dialog class and calling it to process the messages.
BOOL CMyDialog::ProcessDialogMessages()
{
Sleep(0); // Yield to other
// system processes
// Process the message queue
MSG dlgMsg;
if (::PeekMessage (&dlgMsg, NULL, 0, 0, PM_NOREMOVE))
// If there are
// pending messages
{
if (!AfxGetApp ()->PumpMessage ()) { // Allow them to be
// processed
::PostQuitMessage (0); // When no more
// messages exist,
// return WM_QUIT
// should return 0
return TRUE; // Return the caller,
// indicating that
// we just processed
// a Message and that
// there may be more
}
}
// Simulate idle processing.
LONG lIdle = 0;
while (AfxGetApp ()->OnIdle (lIdle++));
return FALSE; // Return to Caller,
// saying that we
// did not process
// any messages
}
Downloads
Download demo project - 4 KbDownload source - 26 Kb

Comments
Fibers
Posted by Legacy on 07/23/2003 12:00amOriginally posted by: John
If you don't want to use threads in your program, you could also try using fibers. Fibers can be scheduled within one thread according to your own algorithm, suiting a program like this quite well. See Jeffrey Richter's "Programming Applications for Microsoft Winodws" (5th Ed.) or MSDN for more information.
Reply