各位大大好,
我的WSAWaitForMultipleEvents當WSA_WAIT_TIMEOUT時會佔用CPU?
要如何解 ?
謝謝各位!

解决方案 »

  1.   

    什么叫当WSA_WAIT_TIMEOUT时会占用cpu
    WSA_WAIT_TIMEOUT不是返回值么
    既然函数返回就是释放所属线程了
    占用cpu不是正常的么
      

  2.   

    我的Socket程序是client端non-blocking程序,以Windows Service执行。以多个thread建立与Server联机,各自有自已的socket id ,各自建立WSAEventSelect,对server端发出电文,等待server端10秒内回应。
    正常情况下都没有问题,但当server端没有响应后,于WSAWaitForMultipleEvents回应WSA_WAIT_TIMEOUT时,只show出我的最后一次debug讯息,也没有return,CPU即开始上升至90%,该thread就hand住了,,,int SOCKETServer::Receive(char *recv_msg, int time_out)
    {
       DWORD           dwIndex;
       int             bytesRcvd=0, maxDescriptor=0;
       char            msg[40];
       
       memset(msg, 0, 40);
       
       EventTotal = 0;   try {
          hEvent = WSACreateEvent();
       } catch (...) {
          debuglog(ERR, "Socket WSACreateEvent failed");
          ShowWSALastError();
          return FAIL;
       }   if ( hEvent == WSA_INVALID_EVENT ) {
          debuglog(ERR, "Socket WSACreateEvent error");
          ShowWSALastError();
          return FAIL;
       } 
       // WSAEventSelect
       try {
          rv = WSAEventSelect(clntSock, hEvent, FD_READ);
       } catch (...) {
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          debuglog(ERR, "Socket WSAEventSelect failed");
          ShowWSALastError();
          return FAIL;
       }   if ( rv == SOCKET_ERROR ) {
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          debuglog(ERR, "Socket WSAEventSelect error");
          ShowWSALastError();
          return FAIL;
       }   SocketArray[EventTotal] = clntSock;
       EventArray[EventTotal]  = hEvent;
       EventTotal++;
       WSANETWORKEVENTS NetworkEvent;
       
       
       try {
          dwIndex = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, (time_out*1000), FALSE);
       } catch (...) {
          debuglog(ERR, "Socket WSAWaitForMultipleEvents failed");
          ShowWSALastError();
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          return FAIL;
       }   if ( dwIndex == WSA_WAIT_FAILED ) {
          debuglog(ERR, "Socket WSAWaitForMultipleEvents error");
          ShowWSALastError();
          WSACloseEvent(hEvent);
          return FAIL;   } else if ( dwIndex == WSA_WAIT_TIMEOUT ) {
          debuglog(ERR, "WSAWaitForMultipleEvents timeout !");
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          Disconnect();
          ShowWSALastError();   <<<--- 执行到这
          return TIME_OUT;      <<<--- 看起来没有return,因为return后的debug讯息没有show出来   } else if ( dwIndex == WAIT_IO_COMPLETION ) {
          debuglog(ERR, "WSAWaitForMultipleEvents WAIT_IO_COMPLETION !");   } else {
          // do nothing
       }
       try {
          rv = WSAEnumNetworkEvents(SocketArray[dwIndex - WSA_WAIT_EVENT_0], EventArray[dwIndex - WSA_WAIT_EVENT_0], &NetworkEvent);
       } catch (...) {
          debuglog(ERR, "Socket WSAEnumNetworkEvents failed");
          ShowWSALastError();
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          return FAIL;
       }   if ( rv == SOCKET_ERROR ) {
          debuglog(ERR, "WSAEnumNetworkEvents error !");
          ShowWSALastError();
          WSAResetEvent(hEvent);
          WSACloseEvent(hEvent);
          return FAIL;
       }
       if ( NetworkEvent.lNetworkEvents & FD_READ ) {          try {
                 bytesRcvd = recv(SocketArray[dwIndex - WSA_WAIT_EVENT_0], recv_msg, RCVBUFSIZE, 0);
                 if ( bytesRcvd == 0 ) {
                    debuglog(ERR, "Socket connection has been gracefully closed");
                    ShowWSALastError();
                    WSAResetEvent(hEvent);
                    WSACloseEvent(hEvent);
                    return FAIL;             } else if ( bytesRcvd == SOCKET_ERROR ) {
                    debuglog(ERR, "socket receive error");
                    ShowWSALastError();
                    WSAResetEvent(hEvent);
                    WSACloseEvent(hEvent);
                    return FAIL;             } else if ( bytesRcvd < 0 ) {
                    debuglog(ERR, "socket receive error ( bytesRcvd<0 )");
                    ShowWSALastError();
                    WSAResetEvent(hEvent);
                    WSACloseEvent(hEvent);
                    return FAIL;             } else {
                    // data normally receive
                 }
              } catch (...) {
                 debuglog(ERR, "Socket receive failed");
                 ShowWSALastError();
                 WSAResetEvent(hEvent);
                 WSACloseEvent(hEvent);
                 return FAIL;
              }   }   //sprintf(msg, "socket receive %d bytes", totalBytesRcvd);
       //debuglog(ERROR, msg);   //sprintf(msg, "%s recv", CURRENT_TIME_HHMMSSsss);   //debugdump(bytesRcvd, (unsigned char *)recv_msg, msg);
       WSAResetEvent(hEvent);
       WSACloseEvent(hEvent);   return bytesRcvd;
    }谢谢您 !! ^^
      

  3.   

    WSA_WAIT_TIMEOUT时,WSAWaitForMultipleEvents调用已经返回了,此时占CPU,说明是你的代码占CPU,因为现在正在运行你的代码。