2013-08-21 78 views
0

MSDN說AcceptEx()可能會返回TRUE,但我永遠無法重現這一點。異步函數同步結束時是否設置了OVERLAPPED.hEvent?

如果AcceptEx()返回TRUE,是否會設置hEvent?在AcceptEx()返回TRUE後調用GetOverlappedResult()是否安全?

對於像ReadFile()這樣的其他函數是否一樣?

+0

這對於所有重疊的I/O操作在技術上是可行的。不太可能用於AcceptEx()並且難以測試。 Readfile()很可能。不,不使用GetOverlappedResult(),它已經完成而不使用重疊操作。 –

+0

如何用ReadFile重現它? – basin

+0

即使沒有FILE_FLAG_OVERLAPPED,ReadFile也會更新重疊結構並設置事件。我認爲在任何情況下調用GetOverlappedResult()都是安全的 – basin

回答

1

至少對於ReadFile(套接字)就是這樣的:
如果ReadFile()成功或失敗並返回ERROR_IO_PENDING,則設置該事件。
如果在調用ReadFile()之前關閉連接,則失敗,並且未設置事件。

0

從我可以從AcceptEx的MSDN頁面和OVERLAPPED結構講,當AcceptEx完成它應該設置OVERLAPPED::hEvent手柄信號。

MSDN page of OVERLAPPED

的句柄將被設置爲一個信號狀態由系統當操作已完成的事件。在將此結構傳遞給任何重疊函數之前,用戶必須使用CreateEvent函數將此成員初始化爲零或有效的事件句柄。

它在這裏說得相當廣泛,我想說的是可以安全地假設它適用於所有采用OVERLAPPED結構的函數。

如果您的AcceptEx永不返回true,則可能是您的代碼中存在錯誤。除非你發佈實際的代碼,否則很難說出可能的結果。

在同一頁上OVERLAPPED它說,這大約ReadFile

函數,如ReadFile的和WriteFile設置這個句柄無信號狀態,他們開始的I/O操作之前。 操作完成後,手柄設置爲發信號狀態。

至於調用GetOverlappedResult也明確規定做什麼:

功能,如GetOverlappedResult和同步等待功能復位自動重置事件到無信號狀態。因此,您應該使用手動重置事件; 如果您使用自動重置事件,您的應用程序可以停止響應,如果您等待操作完成,然後調用GetOverlappedResult與bWait參數設置爲TRUE。

就像@HansPassant在評論中說的,不要用它。

+0

http://stackoverflow.com/a/2511763/24937不同意 –

+0

http://blogs.msdn.com/b/oldnewthing/archive/2014/02/06/10497096.aspx但同意 - 我現在很困惑: - ) –