次の方法で共有


デバイスの入力とイベント (POS for .NET v1.14 SDK ドキュメント)

すべての POS デバイスは、アプリケーションとは関係なく、イベントを生成したり、状態を変更したりできます。 たとえば、オペレーターが PinPad デバイスを取り外した場合、アプリケーションによって要求された状態変更ではないため、アプリケーションでこの変更を検出する直接的な方法はありません。 サービス オブジェクトには、これらの状態変更をアプリケーションに警告する何らかの方法が必要です。

マルチスレッド

アプリケーションでサービス オブジェクトの現在の状態を継続的にポーリングするのはコストがかかりすぎるため、別の解決策が必要です。 一般的な解決策は、デバイスを監視するバックグラウンド スレッドを作成することです。

他の例で示したように、スキャナーや磁気ストリップ リーダーなどの入力デバイスでは、常にリーダー スレッドを作成する必要があります。 ただし、ライン ディスプレイやプリンターなどの出力デバイスでは、電源喪失やオフライン移行などの状態変化を監視して、StatusUpdateEvent イベントをアプリケーションに送信するために、2 番目のスレッドが必要になることがよくあります。

このようにして、サービス オブジェクトは、ハードウェアを非同期的に監視しながら、アプリケーションからの要求に応答できます。

イベントの定義

イベントは、サービス オブジェクトがデバイスの状態変化または新しいデータの到着をアプリケーションに通知するメカニズムです。

一般に、イベントとは、何かが発生したことを示す、スレッド間またはプロセス間の通知です。 具体的には、Microsoft Point of Service for .NET (POS for .NET) では、.NET のデリゲート機能を使ってアプリケーションに配信します。

Unified Point Of Service (UnifiedPOS) の仕様では、DataEventDirectIOEventErrorEventOutputCompleteEventStatusUpdateEvent の 5 つのイベントのセットが定義されています。 各サービス オブジェクトでは、これらのサブセットのみをサポートできます。 また、データの正確な内容は、サービス オブジェクトの種類によっても異なります。

イベント キュー

POS for .NET の Base クラスの 1 つから派生するサービス オブジェクト クラスを作成した場合、イベントはサービス オブジェクトからアプリケーションに直接送信されません。 代わりに、イベントは Base クラスによって管理されるキューに格納されます。 アプリケーションにイベントを配信できるようになる前に満たされる必要がある条件があるため、Base クラスのコードによるイベントのディスパッチは、そうすることが適切な場合にのみ行われます。 キューについて、またはイベント発生の前提条件となる要件について、サービス オブジェクトで認識する必要はありません。 これにより、サービス オブジェクト開発者の負担が大幅に軽減されます。

イベント キューは、独自のスレッドを使って非同期的に動作します。 つまり、サービス オブジェクトはイベントの実際の配信を待機しません。

キューへのイベントの追加

POS for .NET の Base クラスには、サービス オブジェクトとイベントの種類に応じて、キューにイベントを追加するさまざまな方法が用意されています。

多くの Base クラスには、特定のイベントのキュー登録を簡単にするためのヘルパー メソッドがあります。最も一般的なのは DataEvent イベントです。 たとえば、カードの読み取りが成功した後は、MsrBase.GoodRead メソッドを使って DataEvent イベントをキューに登録できます。 同様に、PosKeyboard.KeyDown は、キーが押されたことを示す DataEvent をキューに登録します。

また、特定の状態が変更されたときは、Base クラスによってイベントが自動的にキューに登録されることもあります。 たとえば、サービス オブジェクトで Properties.CapPowerReporting プロパティが設定されている場合は、サービス オブジェクトの Properties.PowerState プロパティを設定するだけで、電源の変化を示す StatusUpdateEvent を送信できます。

最後に、必要な場合は、いずれかの QueueEvent のオーバーライドを使って、サービス オブジェクトでイベントをキューに明示的に登録できます。 これが最もよく使われるのは、DirectIOEvent を送信する場合です。 DirectIOEvent イベントはベンダー固有およびデバイス固有であるため、一般的なメカニズムを使ってキューに登録することはできません。

同期入力

ほとんどのデバイス入力は、サービス オブジェクトによって非同期的に読み取られた後、イベントの形式でアプリケーションにディスパッチされますが、アプリケーションでサービス オブジェクトにデータを要求し、データの準備が完了するかタイムアウトになるまで、戻らないでいることができます。 イベント ドリブンの入力について詳しくは、「イベントの管理」をご覧ください。

参照

タスク

概念

その他の参照情報