2016-03-29 53 views

回答

6

它僅用於在Windows上,THandleObject(及其後代TEventTSimpleEventTMutexTSemaphore)在下面的方法:

  1. THandleObject.WaitFor()。當對象創建爲UseCOMWait設置爲True時,等待由Win32 API CoWaitForMultipleHandles()函數處理,如果報告爲RPC_S_CALLPENDING,則返回wrIOCompletion。當UseCOMWait爲False時,該等待由Win32 API WaitForMultipleObjectsEx()函數處理。

  2. THandleObject.WaitForMultiple()。如果UseCOMWait參數爲True,並且CoWaitForMultipleHandles()報告爲RPC_S_CALLPENDING,或者UseCOMWait爲False,並且WaitForMultipleObjectsEx()報告爲WAIT_IO_COMPLETION,則返回wrIOCompletion

無論哪種方式,意思是一樣的:

等待是由一個或多個用戶模式異步過程調用(APC)結束排隊到螺紋

有關APC隊列的更多詳細信息,請參閱MSDN:

Asynchronous Procedure Calls

Alertable I/O

概括地說,一個可警報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中爲此打開了一個錯誤報告:

RSP-14047 THandleObject never returns wrIOCompletion