1

我有一个线程不断寻找新数据,如果数据还没有在串行缓冲区中,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

我究竟做错了什么?

我不想使用标志,我只想使用ReadFileand GetOverlappedResult,我应该能够用我拥有的代码来完成这个......我假设

4

1 回答 1

3

问题正是所说的数据丢失了......它丢失的原因是因为传递给 readfile 的 bytes 参数是父线程中的局部变量。在本地它会在每个周期重新初始化,所以在我再次进入读取时,跳过读取文件并转到重叠结果,我现在可能正在使用不同的内存区域

于 2012-11-28T20:04:39.250 回答