在浏览器中,您可以指定最终组件的名称和位置。您还可以指定哪些元素映射到组件、任何包含文件的位置以及编译过程中要链接哪些库、附加源和标准标题。
如果组件是可执行文件,Rational Rhapsody 会为它生成规范文件和实施文件,名称为 Main<component>.h 和 Main<component>.c。这些文件是为活动组件而命名的。例如,如果活动组件的名称为 DefaultComponent 并且它是可执行文件,那么其源文件的名称为 MainDefaultComponent.h 和 MainDefaultComponent.c。如果组件是一个库,那么文件会简单地命名为 <component>.h 和 <component>.c(没有“Main”前缀)。
组件规范 (.h) 文件声明了组件及其初始化方法和清除方法。例如:
/************************************************
.
.
.
#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
************************************************/
组件规范文件包含 Ric.h 文件,其中定义了 IBM Rational Rhapsody Developer for C 的实时框架。
主程序循环调用 RiCOXFInit(),框架所提供的其中一个函数。该框架初始化函数执行以下操作:
如果 RiCOXFInit() 成功返回,然后 main() 函数将会执行配置的“初始化”选项卡中输入的任何初始化代码。然后 main() 函数会调用函数来初始化组件(例如,DefaultComponent_Init())。该函数会继而调用函数来初始化组件中包含的任何程序包。
组件初始化之后,main() 函数会调用 RiCOXFStart() 函数来启动主任务。缺省情况下,所生成的代码会将参数值 FALSE 传递给 OXFStart() 函数。这意味着系统不会产生新任务,而模型在主系统线程上运行。
如果您要创建 GUI 应用程序而编译的组件是不能干扰主程序线程的库,您希望将值 TRUE 传递给 RiCOXFStart(),从而防止库控制系统。
合起来,RiCOXFInit() 和 RiCOXFStart() 函数会启动 Rational Rhapsody 模型运行。在您的模型可以开始接收事件之前,必须调用它们。如果组件是将要链接到其他应用程序(例如,GUI 应用程序)的库,那么 Rational Rhapsody 不会为其生成 main() 函数。您必须在主程序循环中的某个位置撰写代码来调用这两个函数(首先 RiCOXFInit(),然后 RiCOXFStart()),以启动事件处理。
如果您的动画端口号已在 rhapsody.ini 文件中设置为除缺省值 6423 之外的任何数字,您必须将正确的端口号作为第三个参数传递给 RiCOXFInit()。
例如,在家庭供暖系统样本中,GUI 应用程序(hhsproto 组件)的程序入口点定义在 hhsprdlg.cpp 文件中,包含以下调用:
RiCOXFInit(NULL, NULL, 6423, "", 0, 0);
RiCOXFInit() 的第三个自变量 6423,是缺省的动画端口号。如果您的动画端口已设置为其他数字,您可以编辑该自变量以匹配当前使用的端口号(例如,6424)。否则,动画将无法工作。
当最后一个事件已处理并且模型到达终止点时,main() 函数会调用函数来清除组件(例如,DefaultComponent_Cleanup())。
组件源文件会生成到配置目录,缺省情况下位于组件目录下。例如:
<project_dir>\<component_dir>\<config_dir>