TWaitResult.wrIOCompletion
是undocumented。有誰知道什麼時候以及如何使用它?何時使用TWaitResult.wrIOCompletion?
回答
它僅用於在Windows上,THandleObject
(及其後代TEvent
,TSimpleEvent
,TMutex
和TSemaphore
)在下面的方法:
THandleObject.WaitFor()
。當對象創建爲UseCOMWait
設置爲True時,等待由Win32 APICoWaitForMultipleHandles()
函數處理,如果報告爲RPC_S_CALLPENDING
,則返回wrIOCompletion
。當UseCOMWait
爲False時,該等待由Win32 APIWaitForMultipleObjectsEx()
函數處理。THandleObject.WaitForMultiple()
。如果UseCOMWait
參數爲True,並且CoWaitForMultipleHandles()
報告爲RPC_S_CALLPENDING
,或者UseCOMWait
爲False,並且WaitForMultipleObjectsEx()
報告爲WAIT_IO_COMPLETION
,則返回wrIOCompletion
。
無論哪種方式,意思是一樣的:
等待是由一個或多個用戶模式異步過程調用(APC)結束排隊到螺紋
有關APC隊列的更多詳細信息,請參閱MSDN:
概括地說,一個可警報I/O或APC操作允許在線程排隊用戶定義的操作/功能,以便其將被線程調用處於安全狀態時,使這種一個電話。 wrIOCompletion
表示正在調用WaitFor/Multiple()
的線程必須在超時時間之前停止等待,以便它可以執行一個或多個排隊的Alertable/APC功能。線程將不得不再次撥打WaitFor/Multiple()
完成等待其所需的對象。
:THandleObject.WaitFor()
目前不支持WAIT_IO_COMPLETION
(錯誤?)當UseCOMWait
是假的。它會返回wrError
代替(和THandleObject.LastError
財產的價值將不會分配!)
:在CoWaitForMultipleHandles()
文檔描述RPC_S_CALLPENDING
爲「超時時間所需要的手柄前經過或手柄信號發出」但是這將是RPC_E_TIMEOUT
的更合適的描述。 (文檔錯誤?)
:在實踐中wrIOCompletion
絕不應該發生,因爲CoWaitForMultipleHandles()
不會與COWAIT_ALERTABLE
標誌稱爲:
如果COWAIT_ALERTABLE標誌在dwFlags中設置,WAIT_IO_COMPLETION值指示的等待已經結束通過一個或多個排隊到該線程的用戶模式異步過程調用(APC)。
而且WaitForMultipleObjectsEx()
不會被調用,其bAlertable
參數設置爲true:
bAlertable [中]
如果這個參數爲TRUE,而線程處於等待狀態,在函數返回時,系統對I/O完成例程或APC進行排隊,並且該線程運行例程或函數。否則,該功能不會返回,並且不會執行完成程序或APC功能。
需要這些條件才能觸發wrIOCompletion
結果。我已經在Quality Portal中爲此打開了一個錯誤報告:
- 1. 何時使用==以及何時使用?
- 2. 何時使用.exe,何時不使用?
- 3. 何時使用R,何時使用SQL?
- 4. 何時/何時使用JSON?
- 5. 何時使用Dispose或何時使用使用
- 6. 何時使用mysql_real_escape_string()
- 7. 何時使用Integer.parseint
- 8. 何時使用session_start()?
- 9. 何時使用this.method()?
- 10. 何時使用straight_join?
- 11. 何時使用AngularJS?
- 12. 何時使用var?
- 13. 何時使用GAC?
- 14. 何時使用memcached
- 15. 何時使用ClassDefiner?
- 16. 何時使用parseInt
- 17. 何時使用chomp?
- 18. 何時使用getparent()
- 19. 何時使用$ .extend({...})?
- 20. 何時使用VectorDrawable?
- 21. 何時使用Mockito.verify()?
- 22. 何時使用{x:Type ...}?
- 23. 何時使用Jumbotron?
- 24. 何時使用MEF
- 25. 何時使用SharePointPermissionAttribute
- 26. 何時使用DwmExtendFrameIntoClientArea?
- 27. 何時使用memcached
- 28. 何時使用Process.EnterDebugMode
- 29. 何時使用convertRowIndexToModel
- 30. 何時使用dependsOn