2016-03-29 3 views

答えて

6

これは、以下の方法でTHandleObject(とその子孫TEventTSimpleEventTMutex、およびTSemaphore)により、Windowsでのみ使用されます。

  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が返されます。

いずれかの方法で、意味は同じです:

待ち時間は、1つまたは複数のユーザーモード非同期プロシージャコール(APC)で終了したが、スレッド

にキューイング

APCキューの詳細については、MSDNを参照してください。

Asynchronous Procedure Calls

012一言で言えば

Alertable I/O

安全な状態でそのような作るときにスレッドによって呼び出されるように、アラート可能なI/OまたはAPC動作は、ユーザ定義の動作/機能は、スレッドにキューイングされることを可能にします呼び出し。 wrIOCompletionは、WaitFor/Multiple()を呼び出すスレッドが、タイムアウトが経過する前に待機を停止して、1つまたは複数の待機可能なAlertable/APC機能を実行できることを示します。スレッドは、WaitFor/Multiple()を再度呼び出して、目的のオブジェクト()の待機を終了する必要があります。


UseCOMWaitがfalseの場合THandleObject.WaitFor()は現在WAIT_IO_COMPLETION(?バグ)を処理しません。これは、代わりにwrErrorを返します(とTHandleObject.LastErrorプロパティの値が割り当てられません!)

CoWaitForMultipleHandles()ドキュメントは、「必要なハンドルまたはハンドルまでの経過タイムアウト期間がを合図た」としてRPC_S_CALLPENDINGを説明し、代わりにRPC_E_TIMEOUTの方が適切な説明になります。 (ドキュメントエラー?)

は:CoWaitForMultipleHandles()COWAIT_ALERTABLEフラグで呼び出されることはありませんので、実際wrIOCompletionに、発生しません:COWAIT_ALERTABLEフラグがdwFlagsパラメータで設定されている場合は

、WAIT_IO_COMPLETIONの値は、待ち時間が終了したことを示しスレッドにキューイングされた1つまたは複数のユーザモードの非同期プロシージャコール(APC)によって呼び出されます。

そしてWaitForMultipleObjectsEx()がTrueに設定されたbAlertableパラメータで呼び出されることはありません:

bAlertable [中]
このパラメータがTRUEで、スレッドが待ち状態にある場合、関数が戻るとき、システムはI/O完了ルーチンまたはAPCを待ち行列に入れ、スレッドはそのルーチンまたは機能を実行する。それ以外の場合、関数は戻りませんし、完了ルーチンまたはAPC関数は実行されません。

これらの条件は、wrIOCompletionの結果をトリガするために必要です。私はQuality Portalのバグレポートを開封しました:

RSP-14047 THandleObject never returns wrIOCompletion

関連する問題