电话的交互性要求 TAPI 成为实时作环境。 许多 TAPI 函数都需要快速完成,并同步将其结果返回到应用程序。 其他函数(如拨号)可能无法快速完成,因此异步作。
电话作以同步或异步方式完成。 这两种模型不同,如下所示。 同步函数 在允许调用方线程从函数调用返回之前执行整个请求。 异步函数 在请求完全执行之前返回。 当异步请求稍后完成时,服务提供商会通过调用 TAPI 最初在初始化序列早期提供给它的回调过程来报告完成。
- 异步作具有一个名为 dwRequestID 的已定义类型 DRV_REQUESTID 作为其第一个参数的参数。 此类作在函数调用中执行部分处理,并在函数调用返回后在独立执行线程中执行其其余部分。 当函数返回时,它将返回负误差结果或 (positive) dwRequestID 在函数调用中传递。 负错误结果指示作已完成(且失败)。 返回的正 dwRequestID 指示作在独立线程中继续。 在这种情况下,服务提供商最终调用 ASYNC_COMPLETION 过程,传递 dwRequestID 和结果代码来指示作的结果。 成功的结果代码为零,或同一组(负)错误结果之一。 在任何情况下,服务提供商不得从指定为异步的函数返回零或除 dwRequestID 以外的任何正值,因为这样做会产生意外的结果。 在从异步函数返回之前,服务提供商应始终将输入数据从应用程序内存复制到服务提供程序内存中。
- 同步作没有 dwRequestID 作为其第一个参数。 此类作在调用方的执行线程中执行其所有处理,并在返回最终结果时返回。 成功的结果为零,或失败的负错误代码。 服务提供商不为同步作调用 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 快速函数引用中的状态。