重叠的 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的主要内容,如果未能解决你的问题,请参考以下文章

IO 完成端口和重叠管理

通过重叠 IO 的异步命名 Windows 管道通信

windows的重叠IO模型

并发程序设计6:IOCP

重叠的 IO 或文件映射?

UDP.5.重叠IO模型:事件通知