Synchrones/asynchrones Modell

Die interaktive Art der Telefonie erfordert, dass TAPI eine Echtzeitbetriebsumgebung ist. Viele der TAPI-Funktionen sind erforderlich, um schnell abgeschlossen zu werden und ihre Ergebnisse synchron an die Anwendung zurückzugeben. Andere Funktionen (z. B. Das Wählen) können möglicherweise nicht so schnell abgeschlossen werden und funktionieren daher asynchron.

Telefonievorgänge werden entweder synchron oder asynchron abgeschlossen. Diese beiden Modelle unterscheiden sich wie folgt. Synchrone Funktionen führen die gesamte Anforderung aus, bevor der Thread des Aufrufers vom Funktionsaufruf zurückgeben darf. Asynchrone Funktionen geben zurück, bevor die Anforderung vollständig ausgeführt wurde. Wenn die asynchrone Anforderung später abgeschlossen wird, meldet der Dienstanbieter den Abschluss, indem er eine Rückrufprozedur aufruft, die TAPI ursprünglich zu einem frühen Zeitpunkt in der Initialisierungssequenz bereitgestellt hat.

  • Asynchrone Vorgänge verfügen über einen Parameter namens dwRequestID des definierten Typs DRV _ REQUESTID als ersten Parameter. Ein solcher Vorgang führt einen Teil seiner Verarbeitung im Funktionsaufruf und den Rest der Verarbeitung in einem unabhängigen Ausführungsthread aus, nachdem der Funktionsaufruf zurückgegeben wurde. Wenn die Funktion zurückgegeben wird, wird entweder ein negatives Fehlerergebnis oder die (positive) dwRequestID zurückgegeben, die im Funktionsaufruf übergeben wurde. Das negative Fehlerergebnis gibt an, dass der Vorgang abgeschlossen ist (und fehlgeschlagen ist). Die zurückgegebene positive dwRequestID gibt an, dass der Vorgang im unabhängigen Thread fortgesetzt wird. In einem solchen Fall ruft der Dienstanbieter schließlich die ASYNC _ COMPLETION-Prozedur auf und übergibt die dwRequestID und einen Ergebniscode, um das Ergebnis des Vorgangs anzugeben. Der Ergebniscode ist 0 (null) für erfolg oder eines der gleichen (negativen) Fehlerergebnisse. In jedem Fall darf der Dienstanbieter niemals null oder einen positiven Wert außer dwRequestID von einer Funktion zurückgeben, die als asynchron festgelegt ist, da dies zu unerwarteten Ergebnissen führen kann. Dienstanbieter sollten Eingabedaten immer aus dem Anwendungsspeicher in den Dienstanbieterspeicher kopieren, bevor sie von einer asynchronen Funktion zurückkehren.
  • Synchrone Vorgänge verfügen nicht über dwRequestID als ersten Parameter. Ein solcher Vorgang führt die gesamte Verarbeitung im Ausführungsthread des Aufrufers aus und gibt das Endergebnis zurück, wenn es zurückgegeben wird. Das Ergebnis ist 0 (null) für den Erfolg oder ein negativer Fehlercode für einen Fehler. Der Dienstanbieter ruft ASYNC _ COMPLETION nicht für synchrone Vorgänge auf.

Es ist interessant, den Zeitlichen Ablauf eines "Abschlussrückrufs" relativ zum Zeitpunkt der Rückgabe der ursprünglichen Anforderung zu berücksichtigen. Eine typische asynchrone Anforderung wird vom Dienstanbieter wie im folgenden Pseudocode implementiert:

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
}

Wenn der Vorgang sehr schnell abgeschlossen wird (oder die ursprüngliche Anforderung sehr langsam zurückgegeben wird), kann der Interrupthandler, der nach Abschluss eines physischen Vorgangs ausgeführt wird, ausgelöst werden, bevor die ursprüngliche Anforderung an die Anwendung oder sogar an TAPI zurückgegeben wird. Dieses Verhalten ist zulässig. TAPI garantiert, dass die Benachrichtigung zur endgültigen Vervollständigung an die Anwendung übermittelt wird, nachdem die ursprüngliche Anforderung zurückgegeben wurde.

TAPI 2.x: Listet auf, welcher Zustand, ob jede Funktion synchron oder asynchron abgeschlossen wird, in TAPI Quick Function Referenceangezeigt wird.