TWaitResult.wrIOCompletion
是undocumented。有谁知道它何时以及如何使用?
答案 0 :(得分:6)
它仅在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
参数为True且CoWaitForMultipleHandles()
报告UseCOMWait
,或RPC_S_CALLPENDING
为假且WaitForMultipleObjectsEx()
报告{{1},则会返回UseCOMWait
}。
无论哪种方式,含义都相同 2 :
等待由一个或多个排队到线程的用户模式异步过程调用(APC)结束
有关APC队列的更多详细信息,请参阅MSDN:
简而言之,Alertable I / O或APC操作允许用户定义的操作/函数在线程中排队,因此当处于安全状态时,线程将调用它来进行此类调用。 WAIT_IO_COMPLETION
表示正在调用wrIOCompletion
的线程必须在超时之前停止等待,因此它可以执行一个或多个排队的Alertable / APC函数。线程必须再次调用WaitFor/Multiple()
才能完成等待其所需对象 3 。
1 :当WaitFor/Multiple()
为false时,THandleObject.WaitFor()
当前不处理WAIT_IO_COMPLETION
(错误?)它将返回UseCOMWait
(并且不会分配THandleObject.LastError
属性的值!)
2 :CoWaitForMultipleHandles()
文档将wrError
描述为“在发出所需句柄信号之前经过的超时时间”,但是对RPC_S_CALLPENDING
来说更合适。 (文档错误?)
3 :实际上RPC_E_TIMEOUT
永远不会发生,因为永远不会使用wrIOCompletion
标志调用CoWaitForMultipleHandles()
:
如果在dwFlags中设置了COWAIT_ALERTABLE标志,则值WAIT_IO_COMPLETION表示等待由一个或多个排队到该线程的用户模式异步过程调用(APC)结束。
WaitForMultipleObjectsEx()
永远不会被调用,其COWAIT_ALERTABLE
参数设置为True:
bAlertable [in]
如果此参数为TRUE且线程处于等待状态,则该函数在系统对I / O完成例程或APC进行排队时返回,并且该线程运行例程或函数。否则,该函数不会返回,并且不会执行完成例程或APC功能。
触发bAlertable
结果需要这些条件。我在Quality Portal: