Visual C++ 6 Unleashed

Visual C++ 6 Unleashed

By MICKEY WILLIAMS and David Bennett

The Message Pump

Now that all the initialization for your program has executed, the CWinThread::Run() function will start up the message pump, or message loop, of your application. The message pump will do nothing but wait until it receives a message. At this point, the message is dispatched to a message-handler function, provided by your application or by MFC, that will react to the message. The details of message dispatching are covered in the next chapter.

OnIdle()

When I said that the message pump does nothing but wait around between messages, I stretched the truth just a little. When the message pump finds that the message queue is empty, it will call OnIdle(), which may allow you to do some background processing or update the status of your user interface objects, such as disabling toolbars if needed.

The OnIdle() function will be called repeatedly until it returns FALSE, or until a message is received—at which point, the message is dispatched. When OnIdle() returns FALSE, the message pump will sleep until the next message arrives.

If you choose to implement your own OnIdle() function, you should keep in mind that the message queue for your application (or at least this thread) will not be able to process any messages until OnIdle() returns, because this is a non-preemptive method of multitasking. If you want to do preemptive multitasking, see Chapter 16, "Multithreading." Also, your implementation of OnIdle() should call the base class implementation, which updates user interface objects and cleans up some internal data structures. With this in mind, the declaration of OnIdle() looks like this:

virtual BOOL OnIdle(LONG lCount);

The lCount parameter is incremented each time OnIdle() is called and it is set to 0 when new messages are processed.

Share ThisShare This

Informit Network