WaitForMultipleObjects 超时后的错误现象
WaitForMultipleObjects 超时后的异常现象
USB的HID通信,当通信发生一次超时后,再次调用ReadFile,当执行WaitForMultipleObjects时发生异常退出,单步调试不会有问题,全速就会发生异常。分析大概是单步时不会有超时现象,全速会有超时,一单发生超时就异常退出。是什么变量没清还是什么原因呢,请知道的朋友指教!
------解决方案--------------------
------解决方案--------------------
有可能是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执行前断点,然后再线程窗口看看有哪些线程,每个线程跟踪看有没有问题。