何时使用TWaitResult.wrIOCompletion?

时间:2016-03-29 01:35:23

标签: delphi

TWaitResult.wrIOCompletionundocumented。有谁知道它何时以及如何使用?

1 个答案:

答案 0 :(得分:6)

它仅在Windows上使用,THandleObject(及其后代TEventTSimpleEventTMutexTSemaphore)在以下方法中使用:

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

  2. THandleObject.WaitForMultiple()。如果wrIOCompletion参数为True且CoWaitForMultipleHandles()报告UseCOMWait,或RPC_S_CALLPENDING为假且WaitForMultipleObjectsEx()报告{{1},则会返回UseCOMWait }。

  3. 无论哪种方式,含义都相同 2

      

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

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

    Asynchronous Procedure Calls

    Alertable I/O

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

    中打开了一个错误报告

    RSP-14047 THandleObject never returns wrIOCompletion