![](/img/trans.png)
[英]In a WIN32 system, how to increment of n bytes a file pointer in an overlapped structure without using LARGE_INTEGER data?
[英]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.