Platform SDK: DLLs, Processes, and Threads |
The following code fragment illustrates the use of the MsgWaitForMultipleObjects function in a message loop.
int MessageLoop ( HANDLE* lphObjects, // handles that need to be waited on int cObjects // number of handles to wait on ) { // The message loop lasts until we get a WM_QUIT message, // upon which we shall return from the function. while (TRUE) { // block-local variable DWORD result ; MSG msg ; // Read all of the messages in this next loop, // removing each message as we read it. while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // If it's a quit message, we're out of here. if (msg.message == WM_QUIT) return 1; // Otherwise, dispatch the message. DispatchMessage(&msg); } // End of PeekMessage while loop. // Wait for any message sent or posted to this queue // or for one of the passed handles be set to signaled. result = MsgWaitForMultipleObjects(cObjects, lphObjects, FALSE, INFINITE, QS_ALLINPUT); // The result tells us the type of event we have. if (result == (WAIT_OBJECT_0 + cObjects)) { // New messages have arrived. // Continue to the top of the always while loop to // dispatch them and resume waiting. continue; } else { // One of the handles became signaled. DoStuff (result - WAIT_OBJECT_0) ; } // End of else clause. } // End of the always while loop. } // End of function.