DWORD CNdasIXBcast::ThreadStart(HANDLE hStopEvent) { if (0 == m_NDFSVersion.wMajor && 0 == m_NDFSVersion.wMinor) { return 1; } HANDLE waitHandles[] = { hStopEvent, m_sockAddrChangeNotifier.GetChangeEvent()}; const DWORD nWaitHandles = RTL_NUMBER_OF(waitHandles); // CTask::Initialized called? XTLASSERT(NULL != waitHandles[0]); // m_sockAddrChangeNotifier is initialized? XTLASSERT(NULL != waitHandles[1]); // // Initial bind // ResetBind(hStopEvent); // // initial LPX socket address list is attained // DWORD dwTimeout = 1000; // broadcast interval while (TRUE) { DWORD waitResult = ::WaitForMultipleObjects( nWaitHandles, waitHandles, FALSE, dwTimeout); if (WAIT_OBJECT_0 == waitResult) { return 0; } else if (WAIT_OBJECT_0 + 1 == waitResult) { // reset bind ResetBind(hStopEvent); } else if (WAIT_TIMEOUT == waitResult) { BroadcastStatus(); } else { XTLTRACE2(NDASSVC_IX, TRACE_LEVEL_ERROR, "WaitForMultipleObject failed, waitResult=%d.\n", waitResult); XTLASSERT(FALSE); } } }
DWORD CNdasIXBcast::OnTaskStart() { if (0 == m_NDFSVersion.wMajor && 0 == m_NDFSVersion.wMinor) { return 0; } HANDLE hEvents[2]; hEvents[0] = m_hTaskTerminateEvent; hEvents[1] = m_sockAddrChangeNotifier.GetChangeEvent(); // CTask::Initialized called? _ASSERTE(NULL != hEvents[0]); // m_sockAddrChangeNotifier is initialized? _ASSERTE(NULL != hEvents[1]); // // Initial bind // ResetBind(); // // initial LPX socket address list is attained // DWORD dwTimeout = 1000; // broadcast interval while (1) { DWORD dwWaitResult = ::WaitForMultipleObjects( 2, hEvents, FALSE, dwTimeout); if (WAIT_OBJECT_0 == dwWaitResult) { return 0; } else if (WAIT_OBJECT_0 + 1 == dwWaitResult) { // reset bind ResetBind(); } else if (WAIT_TIMEOUT == dwWaitResult) { BroadcastStatus(); } else { DPErrorEx(_FT("Unexpected wait result %d: "), dwWaitResult); _ASSERTE(FALSE); } } }