컴포넌트

컴포넌트는 컴파일 결과인 2진 레벨 엔티티입니다. 라이브러리(.lib 파일) 및 실행 가능 프로그램(.exe 파일)은 소스 파일이 IBM® Rational® Rhapsody®에서 생성되는 빌드 프로세스의 최종 출력입니다.

브라우저에서 최종 컴포넌트의 이름과 위치를 지정할 수 있습니다. 또한 컴포넌트에 맵핑할 요소, 포함 파일의 위치, 그리고 컴파일 중에 링크할 라이브러리, 추가 소스 및 표준 헤더를 지정할 수 있습니다.

컴포넌트가 실행 파일인 경우 Rational RhapsodyMain<component>.hMain<component>.c라고 하는 스펙 파일과 구현 파일을 생성합니다. 이 파일의 이름은 활성 컴포넌트에 맞게 지정됩니다. 예를 들어, 활성 컴포넌트가 DefaultComponent이고 실행 파일인 경우 해당 소스 파일의 이름은 MainDefaultComponent.hMainDefaultComponent.c입니다. 컴포넌트가 라이브러리인 경우 파일 이름은 단순히 <component>.h<component>.c입니다("Main" 접두부 없이).

컴포넌트 스펙(.h) 파일은 컴포넌트와 해당되는 초기자(initializer) 및 정리 메소드를 선언합니다. 예를 들면, 다음과 같습니다.

/************************************************
.
.
.
#ifndef MainDefaultComponent_H
#define MainDefaultComponent_H
/*---------------------------------------------*/
/* MainDefaultComponent.h                      */
/*---------------------------------------------*/

/* Constructors and destructors:*/

void DefaultComponent_Init();
void DefaultComponent_Cleanup();

#endif

/************************************************
   File Path   : DefaultComponent\DefaultConfig\
MainDefaultComponent.h
************************************************/

컴포넌트 구현(.c) 파일에는 기본 프로그램 루프가 있습니다. 예를 들면, 다음과 같습니다.

.
.
.
#include "MainDefaultComponent.h"
#include <oxf/Ric.h>
#include "Default.h"

/*---------------------------------------------*/
/* MainDefaultComponent.c                      */
/*---------------------------------------------*/

void DefaultComponent_Init() {
    Default_OMInitializer_Init();
}

void DefaultComponent_Cleanup() {
    Default_OMInitializer_Cleanup();
}

int main(int  argc, char*  argv[]) {
   if(RiCOXFInit(argc, argv, 6423, "", 0, 0)) {
      DefaultComponent_Init();
      {
         /*#[ configuration
         DefaultComponent\DefaultConfig */
         /* your code goes here */;
         /*#]*/
      }
      RiCOXFStart(FALSE);
      DefaultComponent_Cleanup();
      return 0;
   }
   else
      return 1;
   }

/************************************************
   File Path   : DefaultComponent\DefaultConfig\
MainDefaultComponent.c
************************************************/

컴포넌트 스펙 파일에는 IBM Rational Rhapsody Developer for C에 대한 실시간 프레임워크가 정의되는 Ric.h 파일이 포함됩니다.

기본 프로그램 루프는 RiCOXFInit()를 호출합니다. 이는 프레임워크가 제공하는 함수 중 하나입니다. 이 프레임워크 초기화 함수는 다음 오퍼레이션을 수행합니다.

RiCOXFInit()가 리턴되는 경우 main() 함수는 구성에 대한 초기화 탭에 입력된 초기화 코드를 실행합니다. 그런 다음 main() 함수는 컴포넌트를 초기화하기 위한 함수를 호출합니다(예: DefaultComponent_Init()). 이 함수는 다시 컴포넌트에 포함된 패키지를 초기화하기 위한 함수를 호출합니다.

컴포넌트가 초기화되면, main() 함수는 기본 태스크를 시작하는 RiCOXFStart() 함수를 호출합니다. 기본적으로 생성된 코드는 FALSE의 매개변수값을 OXFStart() 함수에 전달합니다. 이는 시스템이 새 태스크를 분리(fork)하지 않고 모델이 기본 시스템 스레드에서 실행됨을 의미합니다.

GUI 애플리케이션을 작성 중이고 컴파일된 컴포넌트가 기본 프로그램 스레드를 방해하지 않아야 하는 라이브러리인 경우, TRUE 값을 RiCOXFStart()로 전달하여, 라이브러리가 시스템을 제어하지 않도록 할 수 있습니다.

동시에, RiCOXFInit()RiCOXFStart() 함수는 Rational Rhapsody 모델 실행을 시작합니다. 이 함수는 모델이 이벤트 수신을 시작하기 전에 호출해야 합니다. 컴포넌트가 다른 애플리케이션(예: GUI 애플리케이션)에 링크될 라이브러리인 경우 Rational Rhapsodymain() 함수를 생성하지 않습니다. 이벤트 처리를 시작하려면 애플리케이션에 대한 기본 프로그램 루프의 어디에선가 이 두 함수를 호출할 코드를 작성해야 합니다(RiCOXFInit()RiCOXFStart()를 차례대로).

애니메이션 포트 번호를 rhapsody.ini 파일에서 기본값 6423이 아닌 다른 숫자로 설정하는 경우 올바른 포트 번호를 세 번째 매개변수로 RiCOXFInit()에 전달해야 합니다.

예를 들어 가정 난방 시스템 샘플에서 GUI 애플리케이션(hhsproto 컴포넌트)에 대한 프로그램 시작점은 다음 호출을 사용하여 hhsprdlg.cpp 파일에서 정의됩니다.

RiCOXFInit(NULL, NULL, 6423, "", 0, 0);

RiCOXFInit()의 세 번째 인수 6423은 기본 애니메이션 포트 번호입니다. 애니메이션 포트가 다른 번호로 설정되는 경우 이 인수를 편집하여 사용 중인 번호(예: 6424)와 일치시킬 수 있습니다. 그렇지 않으면 애니메이션이 작동하지 않습니다.

참고: 모든 글로벌 인스턴스는 OXFInit()OXFStart()가 호출되기 전에 작성해야 합니다. 그렇지 않으면 애플리케이션이 충돌합니다.

마지막 이벤트가 처리되고 모델이 끝점에 도달한 경우, main() 함수는 컴포넌트를 정리하기 위한 함수를 호출합니다(예: DefaultComponent_Cleanup()).

구성 디렉토리에(기본적으로 컴포넌트 디렉토리 아래에서) 컴포넌트 소스 파일이 생성됩니다. 예를 들면, 다음과 같습니다.

<project_dir>\<component_dir>\<config_dir>

피드백