OMReactive 클래스는 모든 반응 오브젝트의 기본 클래스이고 기본 이벤트 처리 기능을 구현합니다. 이 클래스는 omreactive.h 파일에 선언되어 있습니다.
반응 오브젝트는 일반적으로 상태 차트 또는 활동 다이어그램을 통해 이벤트를 처리합니다. 반응 오브젝트의 기본 인터페이스는 gen and takeTrigger 메소드입니다.
트리거된 오퍼레이션은 반응 클래스 상태에 영향을 미치는 동기 이벤트입니다. 생성된 코드는 이벤트를 작성한 다음 takeTrigger 메소드를 호출하여 반응 클래스에 전달합니다. 트리거된 오퍼레이션에 대한 추가 정보는 트리거된 오퍼레이션 디스패치의 내용을 참조하십시오.
송신자 오브젝트는 gen 메소드를 OMReactive에서 상속한 이벤트를 수신자에게 전송하는 데 적용합니다. 그런 다음 스레드 내부에서 해당 이벤트를 큐에 대기시킵니다. 이벤트 생성 및 큐에 넣기의 내용을 참조하십시오.
execute 메소드는 스레드의 이벤트 큐에서 대기합니다. 큐에 이벤트가 있으면 takeTrigger 메소드를 사용하여 적절한 OMReactive 오브젝트로 디스패치합니다.
보호된 이 속성은 반응 오브젝트(OMReactive에서 파생된 구체적 오브젝트)가 활성 오브젝트인지 여부를 지정합니다. 활성 오브젝트는 고유한 스레드를 작성하고 OMThread 오브젝트에서 상속합니다.
반응 오브젝트가 활성 오브젝트이면 사용자 애플리케이션이 start 스레드를 호출합니다. 그렇지 않은 경우 호출하지 않습니다.
OMBoolean active;
보호된 이 속성은 반응 오브젝트가 프레임워크 자체에서 사용되는지 여부를 지정합니다(사용자 정의 오브젝트 아님).
기본값은 0 또는 FALSE이고 반응 오브젝트의 생성자인 OMReactive가 지정합니다.
frameworkInstance 속성은 자체적으로 Rational® Rhapsody® 프레임워크를 모델링하는 데 사용할 수 있습니다. 기본값은 FALSE입니다. 일반적으로 기본값을 변경하지 않습니다.
OMBoolean frameworkInstance;
보호된 이 속성은 기본 상태 전이의 일부로 널 상태 전이가 있는 오브젝트를 활성화합니다.
OMStartBehaviorEvent myStartBehaviorEvent;
보호된 이 속성은 반응 오브젝트의 내부 상태(상태 차트의 사용자 클래스 상태와 반대)를 정의합니다.
기본값은 OMRDefaultStatus이고 반응 오브젝트의 생성자인 OMReactive가 지정합니다.
long omrStatus;
보호된 이 속성은 이벤트 이용이 뮤텍스(2진 세마포어)로 보호되도록 지정합니다.
기본값은 0 또는 FALSE이고 반응 오브젝트의 생성자인 OMReactive가 지정합니다.toGuardReactive는 코드 생성 시 사용자 모델링을 기준으로 TRUE로 자동으로 설정됩니다.
OMBoolean toGuardReactive;
이벤트가 사용되었음을 나타냅니다. 이는 다음과 같이 정의합니다.
#define eventConsumed
OMReactive::OMTakeEventCompleted
이벤트가 완료되었으나 이용되지 않았음을 나타냅니다. 이는 다음과 같이 정의합니다.
#define eventNotConsumed
OMReactive::OMTakeEventCompletedEventNotConsumed
omrStatus 속성의 기본값을 지정합니다. OMReactive에서 사용합니다.
const long OMRDefaultStatus = 0x00000000L;
OMReactive 오브젝트의 기본 스레드를 정의합니다. 기본값은 0 또는 널입니다. 즉, OMReactive 오브젝트가 시스템 기본 활성 클래스에서 이벤트를 처리하도록 설정합니다.
#define OMDefaultThread 0
omrStatus에 저장된 OMReactive 내부 상태를 설정하고 가져오는 데 사용됩니다. 이벤트 디스패치를 중지하는 데 omrStatus와 함께 사용됩니다.
OMRInDtor은 상호 배타성으로부터의 보호를 제공하지 않습니다(다른 스레드에서 삭제된 클래스에 이벤트를 디스패치하려는 시도). 상호 배타성 보호를 제공하려는 경우 Rational Rhapsody 코드 생성 문서를 참조하십시오.
const long OMRInDtor = 0x00020000L;
omrStatus에 저장된 OMReactive 내부 상태를 설정하고 가져오는 데 사용됩니다. 생성된 코드에서 널 상태 전이(트리거가 없는 상태 전이)를 사용해야 하는지 여부를 판별하는 데 omrStatus와 함께 사용됩니다.
const long OMRNullConfig = 0x00000001L;
omrStatus에 저장된 OMReactive 내부 상태를 설정하고 가져오는 데 사용됩니다. OMReactive 인스턴스가 상태 머신에서 널 상태 전이를 사용해야 하는지 여부를 판별하는 데 omrStatus와 함께 사용됩니다.
const long OMRNullConfigMask = 0x0000FFFFL;
OMRShouldCompleteStartBehavior
omrStatus에 저장된 OMReactive 내부 상태를 설정하고 가져오는 데 사용됩니다. startBehavior에 대한 호출 시 상태 머신으로 전환이 완료되었는지 여부와 그렇지 않은 경우 사용할 추가 널 상태 전이가 있는지 여부를 omrStatus와 함께 판별합니다.
shouldCompleteRun 메소드가 TRUE인 omrStatus를 리턴하는 경우 startBehavior 메소드가 이 비트를 설정합니다.
이 비트는 첫 번째 이벤트에서 processEvent 메소드가 설정합니다.
const long OMRShouldCompleteStartBehavior =
0x00080000L;
omrStatus에 저장된 OMReactive 상태를 설정하고 가져오는 데 사용됩니다. 반응 오브젝트가 상태 머신에서 종료 커넥터에 도달한 경우 활성 오브젝트가 해당 반응 오브젝트를 삭제하는지 여부를 판별하는 데 omrStatus와 함께 사용됩니다 이는 정적으로 할당된 오브젝트가 상태 머신에서 종료 커넥터를 갖도록 허용합니다.
const long OMRShouldDelete = 0x00040000L;
omrStatus에 저장된 OMReactive 내부 상태를 설정하고 가져오는 데 사용됩니다. 활성 인스턴스가 반응 인스턴스를 안전하게 소멸시키도록 omrStatus와 함께 사용됩니다.
const long OMRShouldTerminate = 0x00010000L;
새 이벤트를 생성합니다. GEN 매크로는 gen 메소드를 사용한 다음 new 연산자를 호출하여 새 이벤트를 작성합니다.
#define GEN (event) gen (new event)
GUI에서 이벤트를 생성합니다. GEN_BY_GUI 매크로는 gen 메소드를 사용한 다음 new 연산자를 호출하여 새 이벤트를 작성합니다. OMGui는 GUI 스레드를 지정합니다.
#define GEN_BY_GUI (event) gen ((OMEvent*)
(new event), OMGui)
송신자 오브젝트에서 수신자 오브젝트로 새 이벤트를 생성합니다. 이 매크로는 송신자를 지정하고 외부 요소(예: GUI)에서 이벤트를 생성하는 데 일반적으로 사용됩니다. GEN_BY_X 매크로는 gen 메소드를 사용한 다음 송신자를 매개변수로 사용하여 new 연산자를 호출하여 새 이벤트를 작성합니다.
#define GEN_BY_X (event, sender) gen (new event,
sender)
ISR(인터럽트 서비스 요청)에서 이벤트를 생성합니다. GEN_ISR 매크로는 genFromISR 매개변수가 TRUE로 지정된 gen 메소드를 사용하여 ISR에서 새 이벤트를 작성합니다.
이벤트는 사용자가 할당해야 합니다. GEN_ISR 자체는 이벤트를 할당하지 않습니다.
#define GEN_ISR (event) gen (event, TRUE)
VxWorks의 경우 GEN_ISR은 이벤트 큐의 헤드에 있는 우선순위가 높은 이벤트를 생성합니다. 첫 번째 이벤트가 처리되기 전에 GEN_ISR에서 다른 이벤트가 생성되면 해당 이벤트는 이전 이벤트 앞에 배치됩니다. VxWorks에서는 반응 오브젝트에 "일반" 이벤트의 플로우가 있고 때때로 반응 오브젝트가 즉시 이용할 수 있도록 큐의 맨 앞에 대기된 우선순위가 높은 단일 이벤트를 가져오는 유스 케이스를 처리하기 위해 GEN_ISR을 구현합니다.
GEN_ISR 이벤트의 버스트가 시스템에 삽입되면 우선순위가 동일한 인터럽트의 이벤트를 처리하도록 프레임워크에서 우선순위 설정에 주석을 달 수 있습니다. OMBoolean VxOSMessageQueue::put(void* m, OMBoolean fromISR)에서 priority = MSG_PRI_URGENT 행에 주석을 답니다.
이러한 공용 관계는 OMReactive 인스턴스의 활성 이벤트 또는 현재 이벤트(현재 처리 중인 이벤트)를 지정합니다. 이러한 관계는 이벤트 큐에서 이벤트를 가져온 경우에만 지정됩니다.
기본값은 널이고 반응 오브젝트의 생성자인 OMReactive가 지정합니다.
OMEvent *event;
이벤트와 트리거된 오퍼레이션 간에 이벤트가 상호 배타적으로 이용되지 않도록 생성된 코드와 함께 사용됩니다.
사용자 반응 클래스에 트리거된 보호 오퍼레이션이 있는 경우 이 관계는 반응 클래스의 OMProtected 부분으로 설정되고 takeEvent 메소드는 processEvent 호출 전에 보호를 잠급니다.
const OMProtected * m_eventGuard;
보호된 이러한 관계는 반응 오브젝트에 대해 이벤트를 큐에 대기시키고 이벤트를 디스패치하는(따라서 이벤트가 활성 클래스의 스레드에서 이용됨) 활성 클래스를 지정합니다.
스레드와 반응 클래스 간에는 단방향 관계가 있습니다. 스레드는 자신의 반응 클래스를 인식하지 않습니다. 반응 클래스가 많을 수 있습니다. 그러나 반응 클래스에는 myThread가 지정한 스레드에 대한 관계가 있습니다.
OMThread *myThread;
이 관계는 시스템에서 재사용가능한 상태 차트 구현을 사용 중인 경우 OMReactive 상태 차트의 루트 상태를 정의합니다.
기본값은 널이고 반응 오브젝트의 생성자인 OMReactive가 지정합니다.
OMComponentState* rootState;