gpt4 book ai didi

c++ - 使用 GetOverlappedResult 丢失数据?

转载 作者:行者123 更新时间:2023-11-30 02:58:36 25 4
gpt4 key购买 nike

我有一个不断寻找新数据的线程,如果数据不在串行缓冲区中,ReadFileGetOverlappedResult 似乎会告诉我有数据,并且它读取了它,但没有将它传输到我的缓冲区中......

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显示了正确的读取字节数(可以看到它读取带有端口监视器)但字节未存储在我的 char* 中。

我经常收到 ERROR_EAINOREAD

我做错了什么?

我不想使用标志,我只想使用 ReadFileGetOverlappedResult,我应该可以用我的代码完成这个.... ...我假设

最佳答案

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

关于c++ - 使用 GetOverlappedResult 丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com