Idle Loop Processing

Environment:

Introduction

Many applications perform lengthy processing "in the background." Sometimes, performance considerations dictate using multithreading for such work. Threads involve extra development overhead, so they are not recommended for simple tasks such as the idle-time work that MFC does in the OnIdle function. This article focuses on a simple idle processing technique using the PeekMessage and PumpMessage functions.

Some kinds of background processing are appropriately done during intervals when the user is not otherwise interacting with the application. In an application developed for the Microsoft Windows operating system, an application can perform idle-time processing by splitting a lengthy process into many small fragments. After processing each fragment, the application yields execution control to Windows by using a PeekMessage loop.

This small code example surrenders execution of the macro so that the operating system can process other events. This function passes control from the application to the operating system.

Some instances in which this function may be useful include the following:

  • Hardware I/O
  • Delay Loops
  • Operating System Calls
  • DDE Deadlocking

Code Manifesto

PeekMessage

The PeekMessage function dispatches incoming sent messages, checks the thread message queue for a posted message, and retrieves the message (if any exist).

PumpMessage

Although the PumpMessage API is undocumented, you can examine its source code in the ThrdCore.Cpp file in MFC\Src relative to your Visual C++ installation.

Using PeekMessage

Here, embed the message loop in one of your functions. This message loop is very similar to MFC's main message loop, found in CWinThread::Run. That means that such a loop in an application developed with MFC must perform many of the same functions as the main message loop.

void DoEvents()
  {
    MSG dispatch;
    while (::PeekMessage( &dispatch, NULL, 0, 0, PM_NOREMOVE))
      {
        if (!AfxGetThread()->PumpMessage());
      }
  }

The code is embedded in a function named DoEvents(); it loops as long as there is idle processing to do. Within that loop, a nested loop repeatedly calls PeekMessage. As long as that call returns a non-zero value, the loop calls WinThread::PumpMessage to perform normal message translation and dispatching. AFter the inner loop ends, the outer loop performs idle processing with one or more calls. Declare and call DoEvents() from your own function.

One more thing, you might encounter a warning C4390 during compile, asking you to satisfy it with a controlled statement. The remedy is simple; you may add your own control statement inside the block or simply ignore it.

Any good, bad, or ugly feedback will be appreciated. If you think I have left out something or you have even some better ideas, please feel free to e-mail me at asceder@yahoo.com.



Comments

  • Idle Loop Processing

    Posted by Legacy on 12/08/2003 12:00am

    Originally posted by: dagza

    This little piece of code has made the day!!!

    Reply
  • J.R is right again: I've seen the code elsewhere

    Posted by Legacy on 10/09/2002 12:00am

    Originally posted by: Christian

    This code is 'leant' from Microsoft, so what is the article about ?

    Christian

    Reply
  • J.R. is right this is not idle processing...

    Posted by Legacy on 09/26/2002 12:00am

    Originally posted by: Keith V

    I have done a LOT of OnIdle() processing and yes it IS a lot simpler that multithreading.
    
    

    But this example is not using OnIdle()

    I use a dispatcher within the DoIdle()method of my CWinApp derived class that calls the appropriate code.

    Like this where DoCalculate() does the actual processing

    BOOL CMyAppBase::OnIdle(LONG lCount)
    {

    if (!CWinApp::OnIdle(lCount))
    {
    m_pMyProcessingClass->DoCalculate();
    }

    return TRUE;
    }

    Reply
  • Not Idle, you must mean processing the message queue while the application is busy...

    Posted by Legacy on 09/25/2002 12:00am

    Originally posted by: J.R.

    Hello!
    The title is wrong!
    Not Idle, you must mean processing the message queue while the application is busy!
    This code comes from Microsoft, in the Progress Dialog Control!

    Reply
  • What does this line mean?

    Posted by Legacy on 09/24/2002 12:00am

    Originally posted by: Alex F

    Please explain why do you need "if" in this line:
    if (!AfxGetThread()->PumpMessage());

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • 10 Rules that Make or Break Enterprise App Development Projects In today's app-driven world, application development is a top priority. Even so, 68% of enterprise application delivery projects fail. Designing and building applications that pay for themselves and adapt to future needs is incredibly difficult. Executing one successful project is lucky, but making it a repeatable process and strategic advantage? That's where the money is. With help from our most experienced project leads and software engineers, …

  • The first phase of API management was about realizing the business value of APIs. This next wave of API management enables the hyper-connected enterprise to drive and scale their businesses as API models become more complex and sophisticated. Today, real world product launches begin with an API program and strategy in mind. This API-first approach to development will only continue to increase, driven by an increasingly interconnected web of devices, organizations, and people. To support this rapid growth, …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds