它仅用于在Windows,由THandleObject(及其后代TEvent,TSimpleEvent,TMutex,和TSemaphore)在下面的方法:
THandleObject.WaitFor().当使用UseCOMWait设置为True 创建对象时,等待由Win32 API CoWaitForMultipleHandles()函数处理,wrIOCompletion如果RPC_S_CALLPENDING报告则返回.如果UseCOMWait为False,则等待由Win32 API WaitForMultipleObjectsEx()函数1处理.
THandleObject.WaitForMultiple().wrIOCompletion如果UseCOMWait参数为True并CoWaitForMultipleHandles()报告RPC_S_CALLPENDING,或者何时UseCOMWait为False并WaitForMultipleObjectsEx()报告,则返回WAIT_IO_COMPLETION.
无论哪种方式,意思都是相同的2:
等待由一个或多个排队到线程的用户模式异步过程调用(APC)结束
有关APC队列的更多详细信息,请参阅MSDN:
简而言之,Alertable I/O或APC操作允许用户定义的操作/函数在线程中排队,因此当处于安全状态时,线程将调用它来进行此类调用. wrIOCompletion表示正在调用的线程WaitFor/Multiple()必须在超时之前停止等待,因此它可以执行一个或多个排队的Alertable/APC函数.线程将不得不WaitFor/Multiple()再次调用以完成等待其所需对象3.
1:THandleObject.WaitFor()目前不处理WAIT_IO_COMPLETION时(错误?)UseCOMWait是假的.它将返回wrError(并且THandleObject.LastError不会分配属性的值!)
2:CoWaitForMultipleHandles()文档描述RPC_S_CALLPENDING为" 在发出所需句柄或句柄信号之前已经过了超时时间 ",但这将是一个更恰当的描述RPC_E_TIMEOUT.(文档错误?)
3:在实践中wrIOCompletion永远不应该发生,因为CoWaitForMultipleHandles()永远不会用COWAIT_ALERTABLE旗帜调用:
如果在dwFlags中设置了COWAIT_ALERTABLE标志,则值WAIT_IO_COMPLETION表示等待由一个或多个排队到该线程的用户模式异步过程调用(APC)结束.
并且WaitForMultipleObjectsEx()永远不会调用其bAlertable参数设置为True:
bAlertable [in]
如果此参数为TRUE且线程处于等待状态,则该函数在系统对I/O完成例程或APC进行排队时返回,并且该线程运行例程或函数.否则,该函数不返回,并且不执行完成例程或APC功能.
触发wrIOCompletion结果需要这些条件.我在Quality Portal中为此打开了一个错误报告:
RSP-14047 THandleObject永远不会返回wrIOCompletion.