簡體   English   中英

OVERLAPPED Win32 結構中的 hEvent 成員

[英]hEvent member in OVERLAPPED Win32 structure

當使用異步 I/O(或 Win32 術語中的“重疊”I/O)時,我們需要處理OVERLAPPED結構和他的hEvent成員。 如果 I/O 函數會延遲讀取或寫入操作,我們將得到一個ERROR_IO_PENDING錯誤代碼,然后我們將使用WaitForXxxEvent函數等待異步操作完成,然后我們將調用GetOverlappedResult

但是,如果 I/O 操作立即完成,我們將不會得到ERROR_IO_PENDING ,並且在讀取操作中,我們的讀取緩沖區將立即被填滿。 但是OVERLAPPED::hEvent成員呢? 它會被設置為信號狀態嗎? 我還沒有找到關於這一點的明確聲明。

這個問題似乎毫無意義(如果我知道操作已經完成,為什么要處理該事件?),但是我有一個模仿重疊模式的庫,我需要具有相同的確切行為。


正如edgar.holleis他的評論中指出的那樣, Raymond Chen在他的博客中解釋了這一點: 鏈接

如果異步 I/O 同步完成,是否會發出 OVERLAPPED 結構中的 hEvent 信號?

是的。

當 I/O 完成時(無論是同步還是異步),都會發出事件信號並且完成狀態通知會排隊。 GetOverlappedResult/Ex函數可用於等待已經完成的 I/O; 它只會立即返回。 如果你問 HasOverlappedIoCompleted 是否 I/O 完成,並且 I/O 同步完成,它會正確報告,“是的,當然完成了。哎呀,很久以前完成了!”

換句話說,您可以在邏輯上將異步 I/O 請求同步完成的情況視為異步完成。 它只是在你眨眼之前異步完成。

不,不會的。 我花了很長時間才弄清楚這一點;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM