Ejemplo n.º 1
0
THREAD_FUN CNet::DemonLoop(LPVOID p) {
    CNet * pThis = (CNet *)p;
    s64 lTick = ::GetCurrentTimeTick();
    while (true) {
        struct iocp_event * pEvent = NULL;
        if (pThis->m_queue.read(pEvent)) {
            if (pEvent != NULL) {
                switch (pEvent->event) {
                case EVENT_ASYNC_ACCEPT:
                    pThis->DealAcceptEvent(pEvent);
                    break;
                case EVENT_ASYNC_CONNECT:
                    pThis->DealConnectEvent(pEvent);
                    break;
                case EVENT_ASYNC_RECV:
                    pThis->DealRecvEvent(pEvent);
                    break;
                case EVENT_ASYNC_SEND:
                    pThis->DealSendEvent(pEvent);
                    break;
                default:
                    break;
                }
            }
        } else if (pThis->m_stop && pThis->m_queue.IsEmpty()) {
            NET_TRACE("DemonLoop 停止工作");
            return 0;
        }

        if(!pThis->m_demo) {
            if (::GetCurrentTimeTick() - lTick > (u32)(pThis->m_nFrameMs) && pThis->m_nFrameMs != 0) {
                break;
            }
        }
    }
    return 0;
}