WaitForMultipleObjects 超时后的错误现象

WaitForMultipleObjects 超时后的异常现象
USB的HID通信,当通信发生一次超时后,再次调用ReadFile,当执行WaitForMultipleObjects时发生异常退出,单步调试不会有问题,全速就会发生异常。分析大概是单步时不会有超时现象,全速会有超时,一单发生超时就异常退出。是什么变量没清还是什么原因呢,请知道的朋友指教!
BOOL CHIDCmd::ReadFile(char *pcBuffer, DWORD szMaxLen, DWORD *pdwLength, DWORD dwMilliseconds)
{
HANDLE events[2] = {m_hAbordEvent, m_hReadEvent};

OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(overlapped));
overlapped.hEvent = m_hReadEvent;

if(pdwLength != NULL)
*pdwLength = 0;

int error = 0;
if(!::ReadFile(m_hReadHandle, pcBuffer, szMaxLen, NULL, &overlapped))
{
 error = GetLastError();
 if(error == 997)
;// Sleep(10);
 else
return FALSE;
}
DWORD dwIndex = WaitForMultipleObjects(2, events, FALSE, dwMilliseconds);
if(dwIndex == WAIT_OBJECT_0
|| dwIndex == WAIT_OBJECT_0 + 1)
{
ResetEvent(events[dwIndex - WAIT_OBJECT_0]);

if(dwIndex == WAIT_OBJECT_0)
return FALSE; //Abort event
else
{
DWORD dwLength = 0;
//Read OK
GetOverlappedResult(m_hReadHandle, &overlapped, &dwLength, TRUE);
if(pdwLength != NULL)
*pdwLength = dwLength;
return TRUE;
}
}
else
return FALSE;
}

------解决方案--------------------

BOOL CHIDCmd::ReadFile(char *pcBuffer, DWORD szMaxLen, DWORD *pdwLength, DWORD dwMilliseconds)
{
  BOOL bRet = FALSE;

  ResetEvent(m_hReadEvent);
  OVERLAPPED overlapped = {0};
  overlapped.hEvent = m_hReadEvent;
   
  DWORD error = 0;
  if(ReadFile(m_hReadHandle, pcBuffer, szMaxLen, pdwLength, &overlapped))
  {
    bRet = TRUE;
    break;
  }
  else if((error=GetLastError()) == ERROR_IO_PENDING)
  {
    HANDLE events[2] = {m_hAbordEvent, m_hReadEvent};
    switch(WaitForMultipleObjects(2, events, FALSE, dwMilliseconds))
    {
      case(WAIT_OBJECT_0 + 0 ): //abort
      {
        break;
      }
      case(WAIT_OBJECT_0 + 1):
      {
        if(GetOverlappedResult(m_hReadHandle, &overlapped, pdwLength, FALSE))
        {
          bRet = TRUE;
        }
        else
        {
          error=GetLastError()
          ASSERT(FALSE);
        }
        break;
      }       
      default:
      {
        ASSERT(FALSE);
        break;
      }
    }
  }
  else
  {
    ASSERT(FALSE);
  }

  return bRet;
}

------解决方案--------------------
有可能是WaitForMultipleObjects后,该线程挂起,然后别的线程的异常导致进程退出。
检查方式是在WaitForMultipleObjects执行前断点,然后再线程窗口看看有哪些线程,每个线程跟踪看有没有问题。