다음을 통해 공유


이벤트 관리(.NET용 POS v1.14 SDK 설명서)

이벤트 관리는 Microsoft .NET용 POS(서비스 지점)용 프로그래밍 애플리케이션의 주요 측면 중 하나를 나타냅니다. .NET용 POS 시스템의 모든 입력은 이벤트 기반이며, .NET용 POS 아키텍처의 각 세그먼트는 이벤트를 사용하여 다른 애플리케이션 및 서비스 개체와 통신합니다.

이벤트 기반 처리 모델

이벤트 기반 입력은 연결된 POS 디바이스가 데이터 입력을 수신할 때 시작됩니다. 해당 디바이스를 사용하도록 설정하면(DeviceEnabled 속성이 true로 설정됨) 수신된 데이터가 DataEvent 이벤트로 큐에 대기되고 애플리케이션으로 전송됩니다. 이벤트는 내부 서비스 스레드에 의해 선입선출 방식으로 전달됩니다. 이 이벤트가 발생하기 직전에 서비스 개체는 PreFireEvent 메서드를 사용하여 해당 이벤트가 전송되기 전에 속성을 업데이트할 수 있습니다.

AutoDisable 속성이 true로 설정된 경우 이벤트 데이터가 수신되면 디바이스가 자동으로 비활성화됩니다(DeviceEnabled 속성을 false로 설정). 비활성화된 상태에서는 디바이스가 새 입력을 큐에 대기시킬 수 없으며, 가능한 경우 물리적 디바이스가 비활성화됩니다.

애플리케이션이 디바이스에서 입력을 받을 준비가 되면 DataEventEnabled 속성을 true로 설정합니다. 그런 다음, DataEventEnabled 속성이 true로 설정되기 전에 해당 DataEvent 이벤트가 큐에 대기된 경우에도 애플리케이션이 큐에 대기 중인 DataEvent 이벤트를 수신하기 시작합니다.

DataEventEnabled 속성 또는 FreezeEvents 속성을 false로 설정하여 추가 데이터 이벤트를 사용하지 않도록 설정할 수 있습니다. 그러면 애플리케이션이 현재 입력 및 연결된 속성을 처리하는 동안 이후의 입력 데이터가 큐에 대기됩니다. 애플리케이션은 더 많은 데이터를 사용할 준비가 되면 DataEventEnabled 속성을 true로 설정하여 이벤트를 다시 사용하도록 설정할 수 있습니다.

이벤트 기반 입력 및 디바이스 공유

입력 디바이스가 단독 사용 디바이스인 경우 애플리케이션은 디바이스를 클레임하고 활성화해야 이 디바이스를 사용하여 입력을 읽을 수 있습니다.

디바이스를 공유할 수 있는 경우 하나 이상의 애플리케이션이 디바이스를 열고 활성화해야 이 디바이스를 사용하여 입력을 읽을 수 있습니다. 서비스 개체가 DataEvent를 사용하여 데이터를 전송하기 전에 애플리케이션이 Claim 메서드를 호출하여 디바이스에 대한 단독 액세스를 요청해야 합니다. 이벤트 기반 입력이 수신되었지만 디바이스가 클레임되지 않은 상태인 경우 애플리케이션이 디바이스를 클레임하고 DataEventEnabled 속성이 true로 설정될 때까지 입력이 버퍼링됩니다. 이 동작은 여러 애플리케이션 간에 디바이스를 순서대로 공유하여 입력 포커스를 효과적으로 전달합니다.

이벤트 기반 입력 및 오류 처리

이벤트 기반 입력을 수신하는 동안 오류가 발생하면 디바이스가 오류 상태로 전환됩니다. 그런 다음 InputData 또는 InputErrorEvent 궤적을 포함하는 ErrorEvent 이벤트를 큐에 대기시킵니다. 이러한 이벤트는 순서대로 애플리케이션 시퀀싱을 보장하기 위해 DataEventEnabled 속성이 true로 설정될 때까지 전달되지 않습니다. 각 ErrorEvent는 두 가지 가능한 오류 궤적 중 어디에 책임이 있는지 나타냅니다.

  • InputData – 하나 이상의 DataEvent 이벤트가 큐에 대기하는 동안 오류가 발생한 경우에 사용됩니다. ErrorEvent는 입력을 삭제하거나 사용자에게 오류를 알려 애플리케이션이 즉시 응답할 수 있도록 즉각적인 처리하기 위해 이벤트 큐의 맨 위로 이동합니다. 그런 다음 버퍼링된 입력 처리를 완료합니다.
  • Input – 오류가 발생하여 데이터를 사용할 수 없는 경우에 사용됩니다. 오류가 발생할 때 입력 데이터가 이미 큐에 대기 중인 경우 InputData 궤적이 있는 ErrorEvent가 큐에 대기되고 먼저 전달되고 나면 큐의 나머지 DataEvents가 처리됩니다. 마지막으로 Input 값이 있는 ErrorEvent가 전송되어 큐가 비어 있고 데이터를 사용할 수 없음을 나타냅니다. InputData 값이 있는 ErrorEvent가 전달되고 애플리케이션 이벤트 처리기가 Clear 값으로 응답한 경우 이 InputDataErrorEvent는 전달되지 않습니다. 일반적으로 이 오류는 이벤트 큐의 끝에 입력됩니다.

다음 중 하나가 발생하면 디바이스가 오류 상태를 종료할 수 있습니다.

  • 애플리케이션이 InputErrorEvent에서 복구됩니다. 애플리케이션이 ErrorResponse 속성에 대한 Clear 값으로 InputDataErrorEvent에서 복구됩니다.
  • 애플리케이션이 ClearInput 메서드를 호출합니다.

일부 디바이스의 경우 애플리케이션이 메서드를 호출하여 이벤트 기반 입력을 시작해야 합니다. 서비스 개체가 입력을 수신한 후에는 일반적으로 메서드가 다시 호출될 때까지 추가 입력이 수신되지 않습니다. 비동기 입력이라고도 하는 이러한 이벤트 기반 입력의 변형을 사용하는 디바이스의 예로는 MICR(자기 잉크 문자 인식) 및 서명 캡처 디바이스가 있습니다. DataCount 속성을 읽어 큐의 DataEvent 이벤트 수를 가져올 수 있습니다.

ClearInput 메서드를 호출하여 큐의 모든 입력을 삭제할 수 있습니다. ClearInput은 단독 사용 디바이스에 대한 클레임 또는 공유 가능한 디바이스에 대한 열기 후에 호출될 수 있습니다.

일반 이벤트 기반 입력 모델은 입력 데이터를 직접 반환하는 메서드 또는 속성을 포함하는 디바이스 클래스의 정의를 금지하지 않습니다. 동기 입력이라고도 하는 이러한 이벤트 기반 입력의 변형의 예는 Keylock 디바이스입니다.

이벤트 유형

.NET용 POS는 멀티캐스트 대리자를 사용하는 표준 .NET 이벤트로 UnifiedPOS(Unified Point Of Service) 이벤트를 구현합니다. 이벤트는 디바이스가 추가되거나 제거되는 경우와 같이 디바이스의 다양한 활동 또는 변경 내용을 애플리케이션에 알릴 수 있습니다. 다음 표에는 이벤트 유형이 나열되어 있습니다.

이벤트 설명
DataEvent 애플리케이션에게 입력 데이터를 사용할 수 있음을 알리기 위해 서비스 개체에서 발생한 이벤트입니다.
ErrorEvent 애플리케이션에게 디바이스 오류가 발생했으며 오류 조건을 처리하기 위해 애플리케이션의 적절한 응답이 필요하다는 것을 알리기 위해 서비스 개체에서 발생한 이벤트입니다.
StatusUpdateEvent 애플리케이션에게 디바이스 상태 변경을 경고하기 위해 서비스 개체에서 발생한 이벤트입니다.
OutputCompleteEvent 애플리케이션에게 큐에 대기 중인 출력 요청이 성공적으로 완료되었음을 알리기 위해 서비스 개체에서 발생한 이벤트입니다.
DirectIOEvent 애플리케이션에 직접 정보를 전달하기 위해 서비스 개체에서 발생한 이벤트입니다.

서비스 개체는 내부적으로 생성되고 관리되는 큐에 이러한 이벤트를 쌓아야 합니다. 이벤트는 내부 서비스 스레드에 의해 선입선출 방식으로 전달됩니다.

다음 조건에서는 조건이 수정될 때까지 이벤트 전달이 지연됩니다.

  • 애플리케이션이 FreezeEvents 속성을 true로 설정했습니다. FreezeEvents 속성을 사용하면 이벤트를 큐에 대기시킬 수 있지만 FreezeEventsfalse로 설정될 때까지 전달을 방지합니다.
  • 이벤트는 DataEvent 또는 입력 ErrorEvent이지만 DataEventEnabled 속성은 false입니다.

이벤트 큐 관리 규칙은 다음과 같습니다.

  • 디바이스가 활성화된 동안 디바이스는 새 이벤트만 큐에 대기시킬 수 있습니다.
  • 디바이스는 애플리케이션이 Close 메서드를 호출하거나 단독 사용 디바이스의 경우 Release 메서드를 호출할 때까지 큐에 대기된 이벤트를 전달합니다. 이러한 메서드가 호출되면 큐의 남은 이벤트가 모두 삭제됩니다.
  • ClearInput 메서드는 DataEvents 및 입력 DeviceErrorEvents(ErrorLocus = Input 또는 InputData)를 지웁니다.
  • ClearOutput 메서드는 출력 DeviceErrorEvents(ErrorLocus = Output)를 지웁니다.

참고 항목

참조

개념