イベント管理は、Microsoft Point of Service for .NET (POS for .NET) に対応したアプリケーションをプログラミングするうえでの主要な側面の 1 つです。 POS for .NET システムのすべての入力はイベント ドリブンであり、POS for .NET アーキテクチャの各セグメントは、イベントを使用して他のアプリケーションやサービス オブジェクトと通信します。
イベント ドリブンの処理モデル
イベント ドリブンの入力は、アタッチされた POS デバイスがデータ入力を受信したときに開始されます。 そのデバイスが有効になっている場合 (DeviceEnabled プロパティが true に設定されている場合)、受信したデータは DataEvent イベントとしてキューに入れられ、アプリケーションに送信されます。 イベントは、内部サービス スレッドによって先入れ先出し方式で配信されます。 このイベントが発生する直前には、サービス オブジェクトによって PreFireEvent メソッドが使用され、そのイベントの送信前にプロパティが更新される場合があります。
イベント データが受信された後、AutoDisable プロパティが true に設定されていれば、デバイスは自動的に自身を無効化します (DeviceEnabled プロパティを false に設定します)。 無効になっている間、デバイスは新しい入力をキューに登録できず、物理デバイスは無効になります (可能な場合)。
アプリケーションは、デバイスからの入力を受け取る準備ができたら、DataEventEnabled プロパティを true に設定します。 その後、アプリケーションはキューに入れられた DataEvent イベントの受信を開始します。DataEventEnabled プロパティが true に設定される前にキューに入れられた DataEvent イベントも、その対象となります。
DataEventEnabled プロパティまたは FreezeEvents プロパティを false に設定すると、追加のデータ イベントを無効にすることができます。 その場合、後続の入力データは、アプリケーションが現在の入力とその関連プロパティを処理している間、キューに入れられます。 アプリケーションが後続のデータを処理できる状態になったら、DataEventEnabled プロパティを true に設定することで、イベントを再度有効にすることができます。
イベント ドリブンの入力とデバイスの共有
入力デバイスが排他使用デバイスである場合、アプリケーションはそのデバイスを使用して入力を読み取る前に、デバイスを要求して有効にする必要があります。
デバイスが共有可能な場合は、それを使用して入力を読み取る前に、1 つ以上のアプリケーションがデバイスを開いて有効にする必要があります。 サービス オブジェクトが DataEvent を使用してアプリケーションにデータを送信できるようにするには、まずそのアプリケーションが Claim メソッドを呼び出して、デバイスへの排他アクセスを要求する必要があります。 イベント ドリブンの入力を受信したものの、デバイスがまだ要求されていない場合は、アプリケーションがデバイスを要求し、DataEventEnabled プロパティが true に設定されるまで、入力はバッファーされます。 この動作によって、複数のアプリケーション間でデバイスが順番に共有され、それらの間で入力フォーカスが効果的に渡されるようになります。
イベント ドリブンの入力とエラー処理
イベント ドリブンの入力を受信しているときにエラーが発生した場合は、デバイスがエラー状態になります。 その後、ErrorEvent イベント (InputData または InputErrorEvent ローカスを含んだもの) がキューに入れられます。 これらのイベントは、DataEventEnabled プロパティが true に設定され、アプリケーションの順序が正しく保証されるまで配信されません。 各 ErrorEvent では、次の 2 つのエラー ローカスのうち、いずれに該当するかが示されます。
- InputData – 1 つ以上の DataEvent イベントがキューに入っているときにエラーが発生した場合に使用されます。 ErrorEvent は、直ちに処理されるようにイベント キューの先頭にジャンプして配置されます。これにより、アプリケーションは入力をクリアするか、ユーザーにエラーを通知することで、すぐに応答できるようになります。 その後、バッファー内の入力の処理が完了されます。
- Input – エラーが発生し、使用可能なデータがない場合に使用されます。 エラーが発生したときに入力データが既にキューに入っている場合は、InputData ローカスを持つ ErrorEvent がキューに入れられ、最初に配信されます。その後、キュー内の残りの DataEvent が発生して処理されます。 最後に、Input 値を持つ ErrorEvent が送信され、キューが空であることと、使用可能なデータがないことが示されます。 InputData 値を持つ ErrorEvent が配信され、アプリケーション イベント ハンドラーが Clear 値で応答した場合、この InputDataErrorEvent は配信されないことに注意してください。 通常、このエラーはイベント キューの最後に入力されます。
次のいずれかが発生した場合は、デバイスのエラー状態が終了する可能性があります。
- アプリケーションが InputErrorEvent から戻った。 ErrorResponse プロパティが Clear 値になった状態で、アプリケーションが InputDataErrorEvent から戻った。
- アプリケーションが ClearInput メソッドを呼び出した。
一部のデバイスでは、イベント ドリブン入力を開始するためのメソッドをアプリケーションで呼び出す必要があります。 サービス オブジェクトが入力を受信した後、通常は、このメソッドが再度呼び出されるまで、追加の入力は受信されません。 この種のイベントドリブン入力 (非同期入力とも呼ばれます) を使用するデバイスの例としては、磁気インク文字認識 (MICR) デバイスや署名キャプチャ デバイスがあります。 キュー内の DataEvent イベントの数は、DataCount プロパティを読み取ることで取得できます。
ClearInput メソッドを呼び出すと、キュー内のすべての入力を削除できます。 ClearInput は、排他使用デバイスの場合は Claim の後、共有可能デバイスの場合は Open の後に呼び出すことができます。
一般的なイベント ドリブン入力モデルでは、入力データを直接返すメソッドやプロパティを含んだデバイス クラスの定義が妨げられることはありません。 この種のイベントドリブン入力 (同期入力とも呼ばれます) の例としては、キーロック デバイスがあります。
イベントの種類
POS for .NET では、マルチキャスト デリゲートを使用した標準の .NET イベントとして、Unified Point Of Service (UnifiedPOS) イベントが実装されます。 イベントでは、デバイスに関するさまざまなアクティビティや変更がアプリケーションに通知されます (デバイスの追加や削除など)。 次の表は、イベントの種類の一覧です。
| Event | 説明 |
|---|---|
| DataEvent | 入力データが使用可能であることをアプリケーションに通知するために、サービス オブジェクトによって生成されるイベント。 |
| ErrorEvent | デバイス エラーが発生したことと、エラー状態を処理するためにアプリケーションによる適切な応答が必要であることをアプリケーションに通知するために、サービス オブジェクトによって生成されるイベント。 |
| StatusUpdateEvent | デバイスの状態の変化をアプリケーションに警告するために、サービス オブジェクトによって生成されるイベント。 |
| OutputCompleteEvent | キューに登録された出力要求が正常に完了したことをアプリケーションに通知するために、サービス オブジェクトによって生成されるイベント。 |
| DirectIOEvent | 情報をアプリケーションに直接伝達するために、サービス オブジェクトによって生成されるイベント。 |
サービス オブジェクトでは、内部で作成および管理されるキューにこれらのイベントをスタックする必要があります。 イベントは先入れ先出し方式で配信され、内部サービス スレッドによって配信されます。
次の条件が発生した場合は、条件が修正されるまでイベント配信が遅延します。
- アプリケーションで FreezeEvents プロパティが true に設定された。 FreezeEvents プロパティではイベントをキューに入れることができますが、FreezeEvents が false に設定されるまでは配信が禁止されます。
- イベントが DataEvent または入力の ErrorEvent だが、DataEventEnabled プロパティが false になっている。
イベント キュー管理の規則は次のとおりです。
- デバイスでは、そのデバイスが有効になっているときにのみ、新しいイベントをキューに登録できます。
- デバイスは、アプリケーションが Close メソッドを呼び出すか、Release メソッド (排他使用デバイスの場合) を呼び出すまで、キューに登録されたイベントを配信します。 これらのメソッドが呼び出されると、キュー内の残りのイベントはすべて削除されます。
- ClearInput メソッドは、DataEvents と入力の DeviceErrorEvents (ErrorLocus = Input または InputData) をクリアします。
- ClearOutput メソッドは、出力の DeviceErrorEvents (ErrorLocus = Output) をクリアします。
参照
リファレンス
概念
.NET