void WSA_Async::Event_Proc(){ enum{NETWORK_EVENT=0,SYSTEM_EVENT,SIZE}; wstring res; WSANETWORKEVENTS events; DWORD dwResult; m_hWSAEvent=WSACreateEvent(); WSAEventSelect(m_socket->GetSocket(),m_hWSAEvent,FD_READ|FD_CLOSE); HANDLE hWSAEvents[SIZE]; hWSAEvents[NETWORK_EVENT]=m_hWSAEvent; hWSAEvents[SYSTEM_EVENT]=m_hEvent; while(running){ dwResult=WSAWaitForMultipleEvents(SIZE,hWSAEvents,FALSE,WSA_INFINITE,FALSE); if(dwResult==WSA_WAIT_FAILED){ break; } dwResult-=WSA_WAIT_EVENT_0; WSAResetEvent(hWSAEvents[dwResult]); if(dwResult==SYSTEM_EVENT){ while(pause&&running){ if(WSAWaitForMultipleEvents(1,&m_hEvent,FALSE,WSA_INFINITE,FALSE)==WSA_WAIT_FAILED){ break; } WSAResetEvent(m_hEvent); } }else{ wstring read; read.clear(); WSAEnumNetworkEvents(m_socket->GetSocket(),m_hWSAEvent,&events); switch(events.lNetworkEvents){ case FD_READ: m_socket->Recv(&read); m_call(events.lNetworkEvents,(wchar_t*)read.c_str()); break; case FD_CLOSE: m_socket->Reset(); m_call(events.lNetworkEvents,TEXT("")); running=false; break; } } } END: running=false; pause=false; WSAResetEvent(m_hEvent); WSACloseEvent(m_hWSAEvent); }
int Timer_Handler::handle_timeout (const ACE_Time_Value ¤t_time, const void *act) { void *obj = const_cast<void*>(act); Timer_Capability *holder = static_cast<Timer_Capability*>(obj); m_call(); if(m_timer_id != -1) { holder->cancel_timer(m_timer_id); } return 0; }