何时使用TWaitResult.wrIOCompletion?

Sha*_*ews 1 delphi

TWaitResult.wrIOCompletion无证.有谁知道它何时以及如何使用?

Rem*_*eau 6

它仅用于在Windows,由THandleObject(及其后代TEvent,TSimpleEvent,TMutex,和TSemaphore)在下面的方法:

  1. THandleObject.WaitFor().当使用UseCOMWait设置为True 创建对象时,等待由Win32 API CoWaitForMultipleHandles()函数处理,wrIOCompletion如果RPC_S_CALLPENDING报告则返回.如果UseCOMWait为False,则等待由Win32 API WaitForMultipleObjectsEx()函数1处理.

  2. THandleObject.WaitForMultiple().wrIOCompletion如果UseCOMWait参数为True并CoWaitForMultipleHandles()报告RPC_S_CALLPENDING,或者何时UseCOMWait为False并WaitForMultipleObjectsEx()报告,则返回WAIT_IO_COMPLETION.

无论哪种方式,意思都是相同的2:

等待由一个或多个排队到线程的用户模式异步过程调用(APC)结束

有关APC队列的更多详细信息,请参阅MSDN:

异步过程调用

可警告的I/O.

简而言之,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.