DWORD WaitForMultipleObjectsWithMessageLoop(DWORD dwHandles, HANDLE szHandles[], DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags) { DWORD dwResult = WAIT_FAILED; DWORD dwBeginTime = (dwMilliseconds == INFINITE) ? INFINITE : ::timeGetTime(); while(TRUE) { int iWaitTime; if(dwBeginTime != INFINITE) { iWaitTime = dwMilliseconds - (::timeGetTime() - dwBeginTime); if(iWaitTime <= 0) { dwResult = WAIT_TIMEOUT; break; } } else iWaitTime = INFINITE; dwResult = ::MsgWaitForMultipleObjectsEx(dwHandles, szHandles, iWaitTime, dwWakeMask, dwFlags); ASSERT(dwResult != WAIT_FAILED); if(dwResult == (WAIT_OBJECT_0 + dwHandles)) PeekMessageLoop(); else break; } return dwResult; }
void CMirrorDlg::MsgWaitForNotification() { DWORD dwRet; HANDLE hObject[2]; hObject[0] = (HANDLE)m_workThread; hObject[1] = m_hSyncEvent; do { dwRet = ::MsgWaitForMultipleObjects(2, hObject, FALSE, INFINITE, QS_ALLINPUT); if ( dwRet == WAIT_OBJECT_0 || dwRet == WAIT_FAILED ) { DispathNotification(); break; } else if ( dwRet == WAIT_OBJECT_0 + 1) { // Get notification DispathNotification(); } else if ( dwRet ) { PeekMessageLoop(); } } while (TRUE); }