我有一个线程不断寻找新数据,如果数据还没有在串行缓冲区中,ReadFile
并且GetOverlappedResult
似乎告诉我有数据,并且它读取了它,但没有将它传输到我的缓冲区中......
func read()
{
if(state == 0)
{
memset(bytes, '\0', sizeof(amount_to_read));
readreturn = ReadFile(h, bytes, amount_to_read,NULL, osReader);
if(readreturn <= 0)
{
errorcode = GetLastError();
if(errorcode != ERROR_IO_PENDING)
{
SetEAIError(ERROR_INTERNALERROR);
return -1;
}
}
}
if (GetOverlappedResult(h, osReader, &dwRead, FALSE) == false)
{
errorcode = GetLastError();
if (errorcode == ERROR_IO_INCOMPLETE || errorcode == 0)
{
if(dwRead > 0)
{
return 1;
}
//timeout
SetEAIError(ERROR_EAITIMEOUT);
return -1;
}
else
{
//other error
SetEAIError(ERROR_WIN_ERROR);
return -1;
}
}
else
{
//read succeded, check if we read the amount required
if(dwRead != amount_to_read)
{
if(dwRead == 0)
{
//nothing read, treat as timeout
SetEAIError(ERROR_EAINOREAD);
return -1;
}
else
{
//memcpy_s(bytes, sizeof(bytes), readbuf, dwRead);
SetEAIError(ERROR_PARTIALREAD);
*_bytesRead = dwRead;
return -1;
}
}
else
{
if(strlen((char*)bytes) == 0)
{
//nothing read, treat as timeout
SetEAIError(ERROR_EAINOREAD);
return -1;
}
//memcpy_s(bytes, sizeof(bytes), readbuf, dwRead);
*_bytesRead = dwRead;
return 0;
}
}
}
这就是错误代码的含义:
ERROR_TIMEOUT - 将状态切换为 1,使其不再读取,从而
GetOverlappedResult
再次调用INTERNALERROR,ERROR_EAINOREAD - 将状态重置为 0
ERROR_PARTIALREAD - 使用新的字节数开始新的读取
如果我将 GetOverlappedResult 切换为阻塞(传递 TRUE),它每次都有效。如果我将线程切换为仅在我知道那里有数据时才读取它每次都有效。
但是如果那里没有数据,当那里有数据时,它似乎“丢失”了数据,我的读取量参数dwRead
显示了正确的读取字节数(可以看到它用端口监视器读取)但字节没有存储在我的字符 *.
我不断收到 ERROR_EAINOREAD
我究竟做错了什么?
我不想使用标志,我只想使用ReadFile
and GetOverlappedResult
,我应该能够用我拥有的代码来完成这个......我假设