동기/비동기 모델

전화 통신의 대화형 특성을 사용하려면 TAPI가 실시간 운영 환경이어야 합니다. 많은 TAPI 함수는 신속하게 완료하고 결과를 동기적으로 애플리케이션에 반환하는 데 필요합니다. 다른 함수(예: 전화 걸기)는 빠르게 완료할 수 없으므로 비동기적으로 작동할 수 있습니다.

전화 통신 작업은 동기적으로 또는 비동기적으로 완료됩니다. 이러한 두 모델은 다음과 같이 다릅니다. 동기 함수는 호출자의 스레드가 함수 호출에서 반환되도록 허용되기 전에 전체 요청을 실행합니다. 비동기 함수는 요청이 완전히 실행되기 전에 를 반환합니다. 비동기 요청이 나중에 완료되면 서비스 공급자는 TAPI가 초기화 시퀀스 초기에 원래 제공한 콜백 프로시저를 호출하여 완료를 보고합니다.

  • 비동기 작업에는 정의된 형식의 dwRequestID 라는 매개 변수 가 DRV_REQUESTID 첫 번째 매개 변수로 있습니다. 이러한 작업은 함수 호출에서 처리의 일부와 함수 호출이 반환된 후 독립적인 실행 스레드에서 나머지 처리를 수행합니다. 함수가 반환되면 함수 호출에서 전달된 음의 오류 결과 또는 (양수) dwRequestID 를 반환합니다. 음수 오류 결과는 작업이 완료되고 실패했음을 나타냅니다. 반환된 양의 dwRequestID 는 작업이 독립 스레드에서 계속됨을 나타냅니다. 이러한 경우 서비스 공급자는 결국 ASYNC_COMPLETION 프로시저를 호출하여 dwRequestID 및 결과 코드를 전달하여 작업의 결과를 나타냅니다. 결과 코드는 성공에 대해 0이거나 동일한 (음수) 오류 결과 집합 중 하나입니다. 어떤 경우든 서비스 공급자는 비동기로 지정된 함수에서 dwRequestID 이외의 0 또는 양수 값을 반환해서는 안 됩니다. 이렇게 하면 예기치 않은 결과가 발생할 수 있기 때문입니다. 서비스 공급자는 비동기 함수에서 반환하기 전에 항상 애플리케이션 메모리에서 서비스 공급자 메모리로 입력 데이터를 복사해야 합니다.
  • 동기 작업에는 첫 번째 매개 변수로 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 빠른 함수 참조에 표시하는 상태를 나열합니다.