次の方法で共有


同期/非同期モデル

テレフォニーの対話型の性質では、TAPI をリアルタイムの運用環境にする必要があります。 TAPI 関数の多くは、迅速に完了し、結果をアプリケーションに同期的に返す必要があります。 その他の機能 (ダイヤルなど) は、すぐに完了できず、非同期的に動作する場合があります。

テレフォニー操作は、同期的または非同期的に完了します。 これら 2 つのモデルは、次のように異なります。 同期関数 呼び出し元のスレッドが関数呼び出しから返される前に要求全体を実行します。 非同期関数 要求全体が実行される前に返されます。 非同期要求が後で完了すると、サービス プロバイダーは、初期化シーケンスの早い段階で TAPI が最初に指定したコールバック プロシージャを呼び出して完了を報告します。

  • 非同期操作には、最初 パラメーターとして DRV_REQUESTID 定義された型の dwRequestID という名前のパラメーターがあります。 このような操作は、関数呼び出しで処理の一部を実行し、残りの処理は関数呼び出しが返された後に独立した実行スレッドで実行します。 関数が戻ると、負のエラー結果または関数呼び出しで渡された dwRequestID (正) のいずれかが返されます。 負のエラー結果は、操作が完了 (および失敗) したことを示します。 返される正 dwRequestID は、独立したスレッドで操作が続行されることを示します。 このような場合、サービス プロバイダーは最終的に ASYNC_COMPLETION プロシージャを呼び出し、dwRequestID と操作の結果を示す結果コードを渡します。 結果コードは、成功した場合は 0、または同じ (負の) エラー結果のセットのいずれかです。 いずれの場合も、サービス プロバイダーは、非同期として指定された関数から dwRequestID 以外のゼロまたは正の値を返してはなりません。そうしないと、予期しない結果が発生する可能性があるためです。 サービス プロバイダーは、非同期関数から戻る前に、常にアプリケーション メモリからサービス プロバイダー メモリに入力データをコピーする必要があります。
  • 同期操作には、最初のパラメーターとして dwRequestID がありません。 このような操作は、呼び出し元の実行スレッドでそのすべての処理を実行し、返されたときに最終的な結果を返します。 成功した場合は 0、失敗の場合は負のエラー コードになります。 サービス プロバイダーは、同期操作の ASYNC_COMPLETION を呼び出しません。

"完了" コールバックのタイミングは、元の要求がいつ返されるかを基準にして検討することをお勧めします。 一般的な非同期要求は、次の擬似コードのように、サービス プロバイダーによって実装されます。

Some_request(Request_ID, ...) {
  check parameters for validity
  check device state for validity
  store Request_ID for Completion Interrupt Handler's use
  manipulate device registers to start physical operation
  return Request_ID  // to indicate asynch operation
}
Operation Completion Interrupt Handler: {
  if operation was successful then
    call "completion" callback passing Request_ID and "success"
  else
    call "completion" callback passing Request_ID and "error num"
  endif
}

操作が非常に迅速に完了した場合 (または元の要求が非常に遅く返された場合)、物理操作の完了時に実行される割り込みハンドラーが、元の要求がアプリケーションまたは TAPI に戻る前にトリガーされる可能性があります。 この動作は許可されます。 TAPI は、元の要求が返された後に、アプリケーションへの最終的な完了通知が配信されることを保証します。

TAPI 2.x: TAPI クイック関数リファレンス で、各関数が同期的または非同期的に完了したかどうかを示す状態一覧表示します。