重叠的 IO 和 ERROR_IO_INCOMPLETE
Posted
技术标签:
【中文标题】重叠的 IO 和 ERROR_IO_INCOMPLETE【英文标题】:Overlapped IO and ERROR_IO_INCOMPLETE 【发布时间】:2010-11-25 03:49:24 【问题描述】:我已经重叠 IO 工作 2 年了,但我将它与一个新应用程序一起使用,并且它向我抛出了这个错误(当我隐藏主窗体时)。
我已经用谷歌搜索了,但我无法理解错误的含义以及我应该如何处理它?
有什么想法吗?
我在 NamedPipes 上使用它,并且在调用 GetOverlappedResult 后发生错误
DWORD dwWait = WaitForMultipleObjects(getNumEvents(), m_hEventsArr, FALSE, 500);
//check result. Get correct data
BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
// error happens here
【问题讨论】:
看,我知道重叠 I/O 与 I/O 操作有关;插座、磁盘等'。您最好告诉我们您正在执行哪种 I/O 以及您遇到的确切错误是什么。 【参考方案1】:ERROR_IO_INCOMPLETE
是一个错误代码,表示 Overlapped 操作仍在进行中; GetOverlappedResult
返回 false,因为操作尚未成功。
您有两种选择 - 阻塞和非阻塞:
阻止直到操作完成:将您的 GetOverlappedResult
调用更改为:
BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, TRUE);
这确保了 Overlapped 操作在返回结果之前已经完成(即成功或失败)。
轮询完成:如果操作仍在进行中,则可以从函数中返回,并在等待结果的同时执行其他工作:
BOOL fSuccess = GetOverlappedResult(data->hPipe, &data->oOverlap, &cbRet, FALSE);
if (!fSuccess)
if (GetLastError() == ERROR_IO_INCOMPLETE) return; // operation still in progress
/* handle error */
else
/* handle success */
通常,第二个选项比第一个更可取,因为它不会导致您的应用程序停止并等待结果。 (但是,如果代码在单独的线程上运行,则第一个选项可能更可取。)
【讨论】:
我确实尝试将 Wait 更改为 true。刚回到海峡。 在代码的哪一部分设置了data->oOverlap
——即首先使用它调用哪个函数?
它在数据构造函数中设置,事情是它一直工作到一个点。
找出杀死它的原因。有一个无限循环,它填充了管道缓冲区,导致数据无法发送。多么奇怪的错误。以上是关于重叠的 IO 和 ERROR_IO_INCOMPLETE的主要内容,如果未能解决你的问题,请参考以下文章