Processing System Messages

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 Kb
Download source - 26 Kb


Comments

  • Fibers

    Posted by Legacy on 07/23/2003 12:00am

    Originally 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
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: December 11, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT Market pressures to move more quickly and develop innovative applications are forcing organizations to rethink how they develop and release applications. The combination of public clouds and physical back-end infrastructures are a means to get applications out faster. However, these hybrid solutions complicate DevOps adoption, with application delivery pipelines that span across complex hybrid cloud and non-cloud environments. Check out this …

  • On-demand Event Event Date: October 29, 2014 It's well understood how critical version control is for code. However, its importance to DevOps isn't always recognized. The 2014 DevOps Survey of Practice shows that one of the key predictors of DevOps success is putting all production environment artifacts into version control. In this webcast, Gene Kim discusses these survey findings and shares woeful tales of artifact management gone wrong! Gene also shares examples of how high-performing DevOps …

Most Popular Programming Stories

More for Developers

RSS Feeds