OVERLAPPED Win32结构中的hEvent成员

时间:2010-03-24 21:54:34

标签: windows winapi visual-c++ overlapped-io

当使用异步I / O(或Win32术语中的“重叠”I / O)时,我们需要处理OVERLAPPED结构及其hEvent成员。如果I / O函数将延迟读取或写入操作,我们将得到ERROR_IO_PENDING错误代码,然后我们将等待异步操作完成WaitForXxxEvent函数,然后我们将调用{{ 1}}。

但是,如果I / O操作立即完成,我们将不会获得GetOverlappedResult,并且在读取操作中,我们的读缓冲区将立即被填充。但是ERROR_IO_PENDING成员呢?是否会设置为信号状态?我没有找到关于此的明确声明。

这个问题似乎毫无意义(如果我知道该操作已经完成,为什么要处理这个事件?),但是我有一个模仿重叠模式的库,我需要有相同的确切行为。


正如edgar.holleis his comment所指出,Raymond Chen在他的博客中解释了这一点:http://blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx

  

如果异步I / O同步完成,那么OVERLAPPED结构中的hEvent是否会发出信号?

     

     

当I / O完成时(无论是同步还是异步),   发出事件信号并将完成状态通知排队。该   OVERLAPPED::hEvent函数可用于等待I / O.   已经完成;它只会立即返回。如果你问   HasOverlappedIoCoCoted I / O是否已完成,以及I / O.   同步完成后,它会正确报告,“是的,当然是   完成。哎呀,很久以前就完成了!“

     

换句话说,您可以在逻辑上处理异步的情况   I / O请求同步完成,就像它已完成一样   异步。它甚至可以在你出现之前异步完成   闪烁。

1 个答案:

答案 0 :(得分:2)

不,不会。我花了很长时间才想出那个困难的方法;)