- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个不断寻找新数据的线程,如果数据不在串行缓冲区中,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
显示了正确的读取字节数(可以看到它读取带有端口监视器)但字节未存储在我的 char* 中。
我经常收到 ERROR_EAINOREAD
我做错了什么?
我不想使用标志,我只想使用 ReadFile
和 GetOverlappedResult
,我应该可以用我的代码完成这个.... ...我假设
最佳答案
问题恰恰是数据丢失的原因......数据丢失的原因是因为传递给读取文件的 bytes 参数是父线程中的局部变量。在本地它会在每个周期重新初始化,所以在我再次进入读取后,跳过读取文件并转到重叠结果,我现在可能正在使用不同的内存区域
关于c++ - 使用 GetOverlappedResult 丢失数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609037/
我有一个不断寻找新数据的线程,如果数据不在串行缓冲区中,ReadFile 和 GetOverlappedResult 似乎会告诉我有数据,并且它读取了它,但没有将它传输到我的缓冲区中...... fu
我调用 ReadDirectoryChangesW异步监视后台线程中的目录更改。 这是如何打开目录 ( basePath) 并启动“读取”线程的: m_hDIR = CreateFileW(
为什么 GetOverlappedResult需要文件句柄? 似乎 WaitForSingleObject(overlapped->hEvent) 应该足以等待事件,以便重叠 I/O 完成,那么 Ge
GetOverlappedResults()根本不返回。 我运行了下面的简单示例,当网络接口(interface)中的 IP 地址发生更改时,手动重置事件被设置,我可以看到“IP 地址表已更改..”输
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我已经为我们的项目编写了一个文件系统监视器。突然,它停止正确获取事件。我发现,在 GetOverlappedResult 返回 true 后,结果数据为空,返回的字节数也是空的。 这就是我创建用于监视
当我在 Win32 api 上以 OVERLAPPED 方式打开和读取文件时,我有几种方法来完成 IO 请求,包括使用等待文件句柄(或重叠结构中的事件) WaitForSingleObject Get
我是一名优秀的程序员,十分优秀!