Idle Loop Processing



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


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


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


  • 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!!!

  • 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 ?


  • 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))

    return TRUE;

  • 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.

    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!

  • 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());

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

Top White Papers and Webcasts

  • Data center, IT and Operations Architects can now secure their web applications whether they are on-premise, in a virtual environment or in the most popular public cloud, Amazon Web Services (AWS). This blueprint document provides guidance on architecting security for cloud-based web applications.

  • Live Event Date: February 25, 2015 @ 2:00 p.m. ET / 11:00 a.m. PT Secure Shell (SSH) keys provide unmitigated access for privileged users and applications. However, managing and securing these critical privileged credentials poses a real challenge for organizations, putting sensitive data at risk. In fact, more than 50% of organizations report experiencing an SSH Key related compromise. Check out this upcoming eSeminar and join Adam Bosnian, EVP of Global Business Development at CyberArk, as he discusses the …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date