MSDN說AcceptEx()可能會返回TRUE,但我永遠無法重現這一點。異步函數同步結束時是否設置了OVERLAPPED.hEvent?
如果AcceptEx()返回TRUE,是否會設置hEvent?在AcceptEx()返回TRUE後調用GetOverlappedResult()是否安全?
對於像ReadFile()這樣的其他函數是否一樣?
MSDN說AcceptEx()可能會返回TRUE,但我永遠無法重現這一點。異步函數同步結束時是否設置了OVERLAPPED.hEvent?
如果AcceptEx()返回TRUE,是否會設置hEvent?在AcceptEx()返回TRUE後調用GetOverlappedResult()是否安全?
對於像ReadFile()這樣的其他函數是否一樣?
至少對於ReadFile(套接字)就是這樣的:
如果ReadFile()成功或失敗並返回ERROR_IO_PENDING,則設置該事件。
如果在調用ReadFile()之前關閉連接,則失敗,並且未設置事件。
從我可以從AcceptEx
的MSDN頁面和OVERLAPPED
結構講,當AcceptEx
完成它應該設置OVERLAPPED::hEvent
手柄信號。
的句柄將被設置爲一個信號狀態由系統當操作已完成的事件。在將此結構傳遞給任何重疊函數之前,用戶必須使用CreateEvent函數將此成員初始化爲零或有效的事件句柄。
它在這裏說得相當廣泛,我想說的是可以安全地假設它適用於所有采用OVERLAPPED
結構的函數。
如果您的AcceptEx
永不返回true,則可能是您的代碼中存在錯誤。除非你發佈實際的代碼,否則很難說出可能的結果。
在同一頁上OVERLAPPED
它說,這大約ReadFile
函數,如ReadFile的和WriteFile設置這個句柄無信號狀態,他們開始的I/O操作之前。 操作完成後,手柄設置爲發信號狀態。
至於調用GetOverlappedResult
也明確規定做什麼:
功能,如
GetOverlappedResult
和同步等待功能復位自動重置事件到無信號狀態。因此,您應該使用手動重置事件; 如果您使用自動重置事件,您的應用程序可以停止響應,如果您等待操作完成,然後調用GetOverlappedResult與bWait參數設置爲TRUE。
就像@HansPassant在評論中說的,不要用它。
http://stackoverflow.com/a/2511763/24937不同意 –
http://blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx但同意 - 我現在很困惑: - ) –
這對於所有重疊的I/O操作在技術上是可行的。不太可能用於AcceptEx()並且難以測試。 Readfile()很可能。不,不使用GetOverlappedResult(),它已經完成而不使用重疊操作。 –
如何用ReadFile重現它? – basin
即使沒有FILE_FLAG_OVERLAPPED,ReadFile也會更新重疊結構並設置事件。我認爲在任何情況下調用GetOverlappedResult()都是安全的 – basin