KY-RTI分布仿真技术:第七章 Visual C++程序设计

2023-05-16

第七章 Visual C++程序设计

       本章讲述如何基于Visual C++设计仿真程序。演示了2个程序:ping程序和pong程序进行相互之间的通信。程序使用HLA的交互类进行通信,Visual C++与GNU C++一样,头文件与DMSO RTI1.3NGv6完全一致,但KY-RTI效率要比其快很多。

7.1需求分析

       开发2个程序,一个为ping,一个为pong;前者不使用tick服务,后者使用tick服务。

       这两个程序就像2个人打乒乓球一样,1个程序向另一个程序发送1个事件;另一个人收到事件后再给对方发送1个事件;如此循环往复。

7.2项目设计

       按照需求,将要开发的两个程序叫做ping-notick和pong-tick。该项目与时间无关,不需要时间管理服务。本项目采用交互类,并借用KY-RTI的bin目录下已有的chat.fed文件来传输交互。该交互类名为chat,有name和sentence两个参数,如下列代码所示。

class chat {           //交互类

       string  name;     //参数

       string  sentence; //参数

}

       在本项目中,两个程序的name分别设为“ping”和“pong”;sentence为要传输的字符串,其长度可变,具体的值由用户输入确定。

       在本项目中存在一个问题,两个程序总有一个程序先启动,另一个后启动;先启动的程序需要等待另一个程序启动后再协同仿真。本项目让ping-notick先启动,具体方案如图7.1所示。在真实项目中可以采用一个管理成员,各个仿真成员启动后向其发送“启动”交互,当管理成员收到所有仿真成员的交互后就可通知仿真开始。这里只是一个演示项目,使得代码尽可能简单。

       在图7.1中,假定每个仿真成员发送2次交互后,仿真结束。在具体的程序代码中,这个数由用户输入。在程序中还使用了信号量的概念,当一个仿真成员的回调线程收到对方发来的交互时,则释放信号量,通知主线程继续。

       图7.1所示的整个流程为:

  1. ping-notick先启动;
  2. ping-notick主线程等待回调线程释放1个信号量;
  3. pong-tick启动;
  4. pong-tick向ping-notick发送1个交互;
  5. pong-tick主线程等待回调线程释放1个信号量;
  6. ping-notick的回调线程收到交互,释放1个信号量;通知主线程继续;
  7. ping-notick主线程向pong-tick发送1个交互;
  8. ping-notick主线程等待回调线程释放1个信号量;
  9. pong-tick的回调线程收到交互,释放1个信号量;通知主线程继续;
  10. pong-tick主线程向ping-notick发送1个交互;
  11. pong-tick主线程等待回调线程释放1个信号量;
  12. ping-notick的回调线程收到交互,释放1个信号量;通知主线程继续;
  13. ping-notick主线程向pong-tick发送1个交互;
  14. ping-notick已经发送了2个交互,结束仿真;在本项目中休眠一段时间后结束仿真;
  15. pong-tick的回调线程收到交互,释放1个信号量;通知主线程继续;
  16. pong-tick等到了2次回调,结束仿真。

       在实际的代码中,ping-notick采用了信号量,pong-tick采用了一个全局布尔变量,但基本原理与图7.1一样。

                                        图7.1 每个仿真成员发送2次交互后结束仿真

7.3 ping-notick代码设计

       该程序由ping-notick.cpp和HwFederateAmbassador.cpp两个文件组成。前者负责发送交互,后者负责从RTI接收交互,两者在执行时处于2个独立的线程中。

       ping-notick.cpp代码说明:

12行:定义变量STEP,用来表示发送多少次交互后仿真结束,初始值为100;

13行:发送1个交互时要传输的字节数;

16-18行:定义交互类及其参数句柄变量;

33-39行:输入要传输的字节数;

41-48行:输入要发送的交互数;

51-55行:创建1个信号量;

65-72行:创建联邦执行;

74-93行:加入联邦执行;

99-104行:获取交互类及其参数句柄;

107行:公布交互类,只有公布之后才能够向RTI发送交互;

109行:订购交互类,只有订购之后才能够从RTI收到其他人的聊天内容;

111-113行:根据要发送的字节数生成字符串;

115-121行:生成要传输的交互信息,将name和sentence打包,后面直接调用sendInteraction发送;

123-132行:循环操作,每次等待回调线程释放1个信号量,收到信号量后发送1个交互;

138-147行:退出联邦执行,不再参加仿真;

156-169行:销毁联邦。如果是最后一个仿真成员执行该操作,则整个仿真结束。

                                        表7.1  Visual C++ ping-notick示例:ping-notick.cpp

  1. #include "stdafx.h"
  2. #include "HwFederateAmbassador.hh"
  3. #include <RTI.hh>
  4. #include <fedtime.hh>
  5. #include <windows.h>   // for "Sleep"
  6. #include <iostream>
  7. using namespace std;
  8. int STEP=100;
  9. int data_size=1024 ;
  10. //定义交互类句柄和参数句柄
  11. RTI::InteractionClassHandle hChatClass;     //对应chat.xml中的chat交互类
  12. RTI::ParameterHandle        hChatName;      //对应chat交互类的name参数
  13. RTI::ParameterHandle        hChatSentence;  //对应chat交互类的sentence参数
  14. HANDLE  syt;
  15. int hw_main(int argc, char *argv[])
  16. {
  17.     char federationExecutionName[50];//联盟名称
  18.     strcpy(federationExecutionName, "chat");
  19.     char FDDfile[50];//FDD文件
  20.     strcpy(FDDfile, "chat.fed");
  21.     char federateType[50];//盟员名称
  22.     strcpy(federateType, "ping");
  23.     cout << endl << "请输入要传输的字节数:" ; //pingpong要一致
  24.     cin >> data_size;
  25.     if (data_size < 0) {
  26.         cerr << "字节数不正确" << endl;
  27.         exit(1);
  28.     }
  29.     cout << endl << "请输入交互次数:" ;  //pingpong要一致
  30.     cin >> STEP;
  31.     cout << endl;
  32.     if (STEP < 1) {
  33.         cerr << "交互次数不正确" << endl;
  34.         exit(1);
  35.     }
  36.     //syt = CreateSemaphore(NULL, 0, 1, syt_name.c_str()); //no data to read
  37.     syt = CreateSemaphore(NULL, 0, 1, _T("ps")); //no data to read
  38.     if (syt != NULL && GetLastError() == ERROR_ALREADY_EXISTS) {
  39.         printf("Semaphore has been created.\n");
  40.     }
  41.     try {
  42.         RTI::RTIambassador       rti;           // libRTI provided
  43.         HwFederateAmbassador     fedAmb;        // User-defined
  44.         RTI::FederateHandle      federateId;
  45.         RTI::Boolean Joined    = RTI::RTI_FALSE;
  46.         int   numTries  = 0;
  47.         try {
  48.             rti.createFederationExecution(federationExecutionName, FDDfile);
  49.         } catch ( RTI::FederationExecutionAlreadyExists& e ) {
  50.             cerr << "FED_HW: Note: Federation execution already exists." << e << endl;
  51.         } catch ( RTI::Exception& e ) {
  52.             cerr << "FED_HW: ERROR:" << e << endl;
  53.             return -1;
  54.         }
  55.         try {
  56.             cout << "FED_HW: JOINING FEDERATION EXECUTION: " << endl;
  57.             federateId = rti.joinFederationExecution( federateType,
  58.                          federationExecutionName,
  59.                          &fedAmb);
  60.         } catch (RTI::FederateAlreadyExecutionMember& e) {
  61.             cerr << "FED_HW: ERROR: " << argv[1]
  62.                  << " already exists in the Federation Execution "
  63.                  << federationExecutionName << "." << endl;
  64.             cerr << e << endl;
  65.             return -1;
  66.         } catch (RTI::FederationExecutionDoesNotExist&) {
  67.             cerr << "FED_HW: ERROR: Federation Execution "
  68.                  << "does not exists."<< endl;
  69.             rti.tick(2.0, 2.0);
  70.         } catch ( RTI::Exception& e ) {
  71.             cerr << "FED_HW: ERROR:" << e << endl;
  72.             return -1;
  73.         }
  74.         cout << "FED_HW: JOINED SUCCESSFULLY: " << ": Federate Handle = " << federateId << endl;
  75.         
  76.             //获取交互类句柄
  77.         hChatClass = rti.getInteractionClassHandle("chat");
  78.         //获取交互类参数句柄
  79.         hChatName = rti.getParameterHandle("name", hChatClass);
  80.         hChatSentence = rti.getParameterHandle("sentence", hChatClass);
  81.         //公布交互类,这样可以向RTI发送信息
  82.         rti.publishInteractionClass(hChatClass);
  83.         //定购交互类,这样可以接受来自其它发布者的信息
  84.         rti.subscribeInteractionClass(hChatClass);
  85.         string szSentence;
  86.         szSentence.resize(data_size);
  87.         szSentence.assign(data_size, 'a');
  88.         RTI::ParameterHandleValuePairSet* pParams = NULL;
  89.         long numParams(2);
  90.         pParams = RTI::ParameterSetFactory::create (numParams);
  91.         // Add Name
  92.         pParams->add(hChatName,(char*)federateType, strlen(federateType)+1);
  93.         pParams->add(hChatSentence,(char*)szSentence.c_str(), data_size);
  94.         for(int i=0; i<STEP; i++) {
  95.             WaitForSingleObject(syt, INFINITE); //ping先启动,i=0时在这里等待pong启动后向其发送1个交互
  96.             //发送交互,所有定购者(不包括自己)都会在HwFederateAmbassador.cpp中的receiveInteraction服务中收到该交互。
  97.             try {
  98.                 rti.sendInteraction(hChatClass, *pParams, "");
  99.             } catch(...) {
  100.                 cerr << "error for send interaction" << endl;
  101.             }
  102.         }
  103.         pParams->empty();
  104.         delete pParams;   // Deallocate the memory
  105.         Sleep(3000); //3 seconds
  106.         try {
  107.             cout << "FED_HW: RESIGN FEDERATION EXECUTION CALLED" << endl;
  108.             rti.resignFederationExecution(
  109.                 RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  110.                  cout << "FED_HW: SUCCESSFUL RESIGN FEDERATION EXECUTION CALLED" << endl;
  111.         } catch ( RTI::Exception& e ) {
  112.             cerr << "FED_HW: ERROR:" << e << endl;
  113.             return -1;
  114.         }
  115.         //------------------------------------------------------
  116.         // Destroy the federation execution in case we are the
  117.         // last federate. This will not do anything bad if there
  118.         // other federates joined.  The RTI will throw us an
  119.         // exception telling us that other federates are joined
  120.         // and we can just ignore that.
  121.         //------------------------------------------------------
  122.         try {
  123.             cout << "FED_HW: DESTROY FEDERATION EXECUTION CALLED" << endl;
  124.             rti.destroyFederationExecution( federationExecutionName );
  125.                  cout << "FED_HW: SUCCESSFUL DESTROY FEDERATION EXECUTION CALLED" << endl;
  126.         } catch ( RTI::FederatesCurrentlyJoined& /* e */ ) {
  127.             cerr << "FED_HW: FederatesCurrentlyJoined" << endl;
  128.             return 0;
  129.         } catch ( RTI::FederationExecutionDoesNotExist& /* e */) {
  130.             cerr << "FED_HW: FederationExecutionDoesNotExist" << endl;
  131.             return 0;
  132.         } catch ( RTI::Exception& e ) {
  133.             cerr << "FED_HW: ERROR:" << e << endl;
  134.             return -1;
  135.         }
  136.     } catch (RTI::ConcurrentAccessAttempted& e) {
  137.         cerr << e << endl;
  138.         return -1;
  139.     } catch ( RTI::Exception& e ) {
  140.         cerr << "FED_HW: ERROR:" << e << endl;
  141.         return -1;
  142.     }
  143.     cout << "FED_HW: Exiting ." << endl;
  144.     return 0;
  145. }
  146. int
  147. main(int argc, char** argv)
  148. {
  149.     return hw_main(argc, argv);
  150. }

       HwFederateAmbassador.cpp代码说明:

32-45行:由于不处理时间参数,因此如果接收到这种类型的receiveInteraction交互,则直接调用不带时间参数的服务来统一处理;

47-58行:接收到交互后,释放信号量。

                                        表7.2  Visual C++ ping-notick示例:HwFederateAmbassador.cpp

  1. //-----------------------------------------------------------------
  2. // Project Include Files
  3. //-----------------------------------------------------------------
  4. #include "fedtime.hh"
  5. #include "HwFederateAmbassador.hh"
  6. //-----------------------------------------------------------------
  7. // System Include Files
  8. //-----------------------------------------------------------------
  9. #ifndef _MSC_VER
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <iostream.h>
  13. #else
  14. #include <iostream>
  15. using std::cout;
  16. using std::cerr;
  17. using std::endl;
  18. #endif
  19. #include <windows.h>
  20. //-----------------------------------------------------------------
  21. // Bad C like global variables being externed - bad boy!!!
  22. //-----------------------------------------------------------------
  23. extern HANDLE syt;
  24. extern RTI::InteractionClassHandle  hChatClass;
  25. extern RTI::ParameterHandle         hChatName;
  26. extern RTI::ParameterHandle         hChatSentence;
  27. void HwFederateAmbassador::receiveInteraction (
  28.     RTI::InteractionClassHandle       theInteraction, // supplied C1
  29.     const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  30.     const RTI::FedTime&                     theTime,        // supplied C4
  31.     const char                             *theTag,         // supplied C4
  32.     RTI::EventRetractionHandle        theHandle)      // supplied C1
  33. throw (
  34.     RTI::InteractionClassNotKnown,
  35.     RTI::InteractionParameterNotKnown,
  36.     RTI::InvalidFederationTime,
  37.     RTI::FederateInternalError)
  38. {
  39.     this->receiveInteraction( theInteraction, theParameters, theTag );
  40. }
  41. void HwFederateAmbassador::receiveInteraction (
  42.     RTI::InteractionClassHandle       theInteraction, // supplied C1
  43.     const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  44.     const char                             *theTag)         // supplied C4
  45. throw (
  46.     RTI::InteractionClassNotKnown,
  47.     RTI::InteractionParameterNotKnown,
  48.     RTI::FederateInternalError)
  49. {
  50.     cout << "received an interaction from pong" << endl;
  51.     ReleaseSemaphore(syt,1,NULL);
  52. }

7.4 pong-tick代码设计

       pong-tick.cpp代码说明:

13行:定义变量STEP,用来表示发送多少次交互后仿真结束,初始值为100;

14行:发送1个交互时要传输的字节数;

17-19行:定义交互类及其参数句柄变量;

34-40行:输入要传输的字节数;

42-49行:输入要发送的交互数;

59-66行:创建联邦执行;

68-87行:加入联邦执行;

92-96行:获取交互类及其参数句柄;

99行:公布交互类,只有公布之后才能够向RTI发送交互;

101行:订购交互类,只有订购之后才能够从RTI收到其他人的聊天内容;

103-105行:根据要发送的字节数生成字符串;

107-113行:生成要传输的交互信息,将name和sentence打包,后面直接调用sendInteraction发送;

115-127行:循环操作,每次发送1个交互后等待回调线程通知收到交互;124行调用tick获取回调;

134-143行:退出联邦执行,不再参加仿真;

152-165行:销毁联邦。如果是最后一个仿真成员执行该操作,则整个仿真结束。

                                        表7.3  Visual C++ pong示例:pong-tick.cpp

  1. #include "stdafx.h"
  2. #include "HwFederateAmbassador.hh"
  3. #include <RTI.hh>
  4. #include <fedtime.hh>
  5. #  include <windows.h>   // for "Sleep"
  6. #  include <sys/timeb.h> // for "struct _timeb"
  7. #  include <iostream>
  8. using namespace std;
  9. int STEP=100;
  10. int data_size=1024;
  11. //定义交互类句柄和参数句柄
  12. RTI::InteractionClassHandle hChatClass;     //对应chat.xml中的chat交互类
  13. RTI::ParameterHandle        hChatName;      //对应chat交互类的name参数
  14. RTI::ParameterHandle        hChatSentence;  //对应chat交互类的sentence参数
  15. bool  svt = false;
  16. int hw_main(int argc, char *argv[])
  17. {
  18.     char federationExecutionName[50];//联盟名称
  19.     strcpy(federationExecutionName, "chat");
  20.     char FDDfile[50];//FDD文件
  21.     strcpy(FDDfile, "chat.fed");
  22.     char federateType[50];//盟员名称
  23.     strcpy(federateType, "pong");
  24.     cout << endl << "请输入要传输的字节数:" ;  //ping要一致
  25.     cin >> data_size;
  26.     if (data_size < 0) {
  27.         cerr << "字节数不正确" << endl;
  28.         exit(1);
  29.     }
  30.     cout << endl << "请输入交互次数:" ;  //ping要一致
  31.     cin >> STEP;
  32.     cout << endl;
  33.     if (STEP < 1) {
  34.         cerr << "交互次数不正确" << endl;
  35.         exit(1);
  36.     }
  37.     try {
  38.         RTI::RTIambassador       rti;           // libRTI provided
  39.         HwFederateAmbassador     fedAmb;        // User-defined
  40.         RTI::FederateHandle      federateId;
  41.         RTI::Boolean Joined    = RTI::RTI_FALSE;
  42.         int          numTries  = 0;
  43.         try {
  44.             rti.createFederationExecution(federationExecutionName, FDDfile);
  45.         } catch ( RTI::FederationExecutionAlreadyExists& e ) {
  46.             cerr << "FED_HW: Note: Federation execution already exists." << e << endl;
  47.         } catch ( RTI::Exception& e ) {
  48.             cerr << "FED_HW: ERROR:" << e << endl;
  49.             return -1;
  50.         }
  51.         try {
  52.             cout << "FED_HW: JOINING FEDERATION EXECUTION: " << endl;
  53.             federateId = rti.joinFederationExecution( federateType,
  54.                          federationExecutionName,
  55.                          &fedAmb);
  56.         } catch (RTI::FederateAlreadyExecutionMember& e) {
  57.             cerr << "FED_HW: ERROR: " << argv[1]
  58.                  << " already exists in the Federation Execution "
  59.                  << federationExecutionName << "." << endl;
  60.             cerr << e << endl;
  61.             return -1;
  62.         } catch (RTI::FederationExecutionDoesNotExist&) {
  63.             cerr << "FED_HW: ERROR: Federation Execution "
  64.                  << "does not exists."<< endl;
  65.             rti.tick(2.0, 2.0);
  66.         } catch ( RTI::Exception& e ) {
  67.             cerr << "FED_HW: ERROR:" << e << endl;
  68.             return -1;
  69.         }
  70.         /
  71.         //获取交互类句柄
  72.         hChatClass = rti.getInteractionClassHandle("chat");
  73.         //获取交互类参数句柄
  74.         hChatName = rti.getParameterHandle("name", hChatClass);
  75.         hChatSentence = rti.getParameterHandle("sentence", hChatClass);
  76.         //公布交互类,这样可以向RTI发送信息
  77.         rti.publishInteractionClass(hChatClass);
  78.         //定购交互类,这样可以接受来自其它发布者的信息
  79.         rti.subscribeInteractionClass(hChatClass);
  80.         string szSentence;
  81.         szSentence.resize(data_size);
  82.         szSentence.assign(data_size, 'a');
  83.         RTI::ParameterHandleValuePairSet* pParams = NULL;
  84.         long numParams(2);
  85.         pParams = RTI::ParameterSetFactory::create (numParams);
  86.         // Add Name
  87.         pParams->add(hChatName,(char*)federateType, strlen(federateType)+1);
  88.         pParams->add(hChatSentence,(char*)szSentence.c_str(), data_size);
  89.         for(int i=0; i<STEP; i++) {
  90.             //发送交互,所有定购者(不包括自己)都会在HwFederateAmbassador.cpp中的receiveInteraction服务中收到该交互。
  91.             try {
  92.                 rti.sendInteraction(hChatClass, *pParams, "");
  93.             } catch(...) {
  94.                 cerr << "error for send interaction" << endl;
  95.             }
  96.             while(!svt) { //等待ping发交互
  97.                 rti.tick(0.001, 1.0);
  98.             }
  99.             svt = false;
  100.         }
  101.         pParams->empty();
  102.         delete pParams;   // Deallocate the memory
  103.         Sleep(3000); //3 seconds
  104.         try {
  105.             cout << "FED_HW: RESIGN FEDERATION EXECUTION CALLED" << endl;
  106.             rti.resignFederationExecution(
  107.                 RTI::DELETE_OBJECTS_AND_RELEASE_ATTRIBUTES );
  108.             cout << "FED_HW: SUCCESSFUL RESIGN FEDERATION EXECUTION CALLED" << endl;
  109.         } catch ( RTI::Exception& e ) {
  110.             cerr << "FED_HW: ERROR:" << e << endl;
  111.             return -1;
  112.         }
  113.         //------------------------------------------------------
  114.         // Destroy the federation execution in case we are the
  115.         // last federate. This will not do anything bad if there
  116.         // other federates joined.  The RTI will throw us an
  117.         // exception telling us that other federates are joined
  118.         // and we can just ignore that.
  119.         //------------------------------------------------------
  120.         try {
  121.             cout << "FED_HW: DESTROY FEDERATION EXECUTION CALLED" << endl;
  122.             rti.destroyFederationExecution( federationExecutionName );
  123.             cout << "FED_HW: SUCCESSFUL DESTROY FEDERATION EXECUTION CALLED" << endl;
  124.         } catch ( RTI::FederatesCurrentlyJoined& /* e */ ) {
  125.             cerr << "FED_HW: FederatesCurrentlyJoined" << endl;
  126.             return 0;
  127.         } catch ( RTI::FederationExecutionDoesNotExist& /* e */) {
  128.             cerr << "FED_HW: FederationExecutionDoesNotExist" << endl;
  129.             return 0;
  130.         } catch ( RTI::Exception& e ) {
  131.             cerr << "FED_HW: ERROR:" << e << endl;
  132.             return -1;
  133.         }
  134.     } catch (RTI::ConcurrentAccessAttempted& e) {
  135.         cerr << e << endl;
  136.         return -1;
  137.     } catch ( RTI::Exception& e ) {
  138.         cerr << "FED_HW: ERROR:" << e << endl;
  139.         return -1;
  140.     }
  141.     cout << "FED_HW: Exiting ." << endl;
  142.     return 0;
  143. }
  144. int
  145. main(int argc, char** argv)
  146. {
  147.     return hw_main(argc, argv);
  148. }

       HwFederateAmbassador.cpp代码说明:

33-46行:由于不处理时间参数,因此如果接收到这种类型的receiveInteraction交互,则直接调用不带时间参数的服务来统一处理;

48-59行:接收到交互后,通过全局布尔变量通知主线程继续。

                                        表7.4  Visual C++ pong示例:HwFederateAmbassador.cpp

  1. //-----------------------------------------------------------------
  2. // Project Include Files
  3. //-----------------------------------------------------------------
  4. #include "fedtime.hh"
  5. #include "HwFederateAmbassador.hh"
  6. //-----------------------------------------------------------------
  7. // System Include Files
  8. //-----------------------------------------------------------------
  9. #ifndef _MSC_VER
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <iostream.h>
  13. #else
  14. #include <iostream>
  15. using std::cout;
  16. using std::cerr;
  17. using std::endl;
  18. #endif
  19. #include <windows.h>
  20. //-----------------------------------------------------------------
  21. // Bad C like global variables being externed - bad boy!!!
  22. //-----------------------------------------------------------------
  23. extern bool svt;
  24. extern RTI::InteractionClassHandle  hChatClass;
  25. extern RTI::ParameterHandle         hChatName;
  26. extern RTI::ParameterHandle         hChatSentence;
  27. void HwFederateAmbassador::receiveInteraction (
  28.     RTI::InteractionClassHandle       theInteraction, // supplied C1
  29.     const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  30.     const RTI::FedTime&                     theTime,        // supplied C4
  31.     const char                             *theTag,         // supplied C4
  32.     RTI::EventRetractionHandle        theHandle)      // supplied C1
  33. throw (
  34.     RTI::InteractionClassNotKnown,
  35.     RTI::InteractionParameterNotKnown,
  36.     RTI::InvalidFederationTime,
  37.     RTI::FederateInternalError)
  38. {
  39.     this->receiveInteraction( theInteraction, theParameters, theTag );
  40. }
  41. void HwFederateAmbassador::receiveInteraction (
  42.     RTI::InteractionClassHandle       theInteraction, // supplied C1
  43.     const RTI::ParameterHandleValuePairSet& theParameters,  // supplied C4
  44.     const char                             *theTag)         // supplied C4
  45. throw (
  46.     RTI::InteractionClassNotKnown,
  47.     RTI::InteractionParameterNotKnown,
  48.     RTI::FederateInternalError)
  49. {
  50.     cout << "received an interaction from ping" << endl;
  51.     svt = true;
  52. }

7.5编译运行

       下面以Visual C++ 2010为例说明编译运行过程。

       第1步:编译。以ping-notick程序为例说明,pong-tick程序的设置与此相同。

       (1)选择左侧“ping-notick”根节点,按右键选择“属性”,打开属性对话框;

                                        图7.2 选择项目属性

       (2)设置项目属性

  1. 在“配置”处选择Debug或Release等;
  2. 在“平台”处选择32位或64位等;
  3. 选择“C/C++”的“常规”属性,设置KY-RTI的头文件目录,这里设置为“C:\KY-RTI\include;.”。注意,这里有两个目录,一个是KY-RTI的include目录,另一个是当前目录,用‘.’表示,中间用‘;’隔开。
  4. 选择“链接器”的“常规”属性,设置KY-RTI的库文件目录,这里设置为“C:\KY-RTI\lib”。
  5. 选择“链接器”的“输入”属性,设置项目需要的库文件,依照VC版本以及平台属性设置需要的库文件,这里设置为VC2010的64位版本库“libFedTime64VC2010.lib;libRTI-NG64VC2010.lib”。

                                        图7.3 设置项目属性

                                        图7.4 设置库文件目录

                                        图7.5 设置库

       (3)编译,生成可执行程序。

       第2步:修改RTI.rid,查看tick开关。

       ping-notick没有使用tick服务,则关闭tick开关;pong-tick使用了tick服务,则打开tick开关。

       如果当前目录下没有RTI.rid,则运行程序后会自动产生。

       第3步:启动KY-RTI。注意,KY-RTI的IP地址和端口号要与RTI.rid一致。

       第4步:开启两个终端,分别运行ping-notick和pong-tick这2个仿真成员,开始仿真。如图7.6和图7.7所示。在这个例子中,每次传输的字节数为100个字节,一共来回10次。

                                        图7.6 ping-notick运行结果

                                        图7.7 pong-tick运行结果

KY-RTI的Linux、Windows版本和源码请联系作者:walt_lbq@163.com

KY-RTI分布仿真技术:前 言

KY-RTI分布仿真技术:第一章 简介

KY-RTI分布仿真技术:第二章 系统安装

KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

KY-RTI分布仿真技术:第四章 C++程序设计

KY-RTI分布仿真技术:第五章 Qt程序设计

KY-RTI分布仿真技术:第六章 Java程序设计

KY-RTI分布仿真技术:第七章 Visual C++程序设计

KY-RTI分布仿真技术:第八章 Visual C#程序设计

KY-RTI分布仿真技术:第九章 综合演示

KY-RTI分布仿真技术:附录1 分组聊天(HLA数据分发管理的应用)

KY-RTI分布仿真技术:附录2 大联邦(构建1000个成员的HLA/RTI仿真系统)

KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KY-RTI分布仿真技术:第七章 Visual C++程序设计 的相关文章

随机推荐

  • Docker 初学者指南 — 如何使用 Docker-Compose 创建客户端/服务器端

    您是一名开发人员并且想探索 docker compose xff1f 这篇文章是为你而写的 在对 Docker Compose 进行简短介绍后 xff0c 您将能够使用 Docker 创建您的第一个客户端 服务器端应用程序 注意 xff1a
  • WSTOOL中止下载后的错误。{ROS}

    运行wstool init j8 src hydro desktop full wet rosinstall时 xff0c 由于网络原因中止 xff0c 再开的时候会报错 错误提示 xff1a Error There already is
  • FreeRTOS 启动流程浅析 vTaskStartScheduler --待续

    1 Scheduler status xff1a 全局标志 xff1a static volatile BaseType t xSchedulerRunning 61 pdFALSE 取值 xff1a define taskSCHEDULE
  • Windows的linux子系统无法使用NFS

    需求 xff1a 不能装双系统 xff0c 虚拟机本地文件共享又不方便 xff0c 所以想要用win10商店的linux子系统 xff08 ubuntu18 04 xff09 配合NFS实现本地的linux环境编程测试 xff0c 再同步到
  • Docker

    文章目录 Docker1 Docker简介1 1 什么是虚拟化1 2 什么是Docker1 3 容器与虚拟机比较1 4 Docker 组件1 4 1 Docker服务器与客户端1 4 2 Docker镜像与容器1 4 3 Registry
  • tensorflow图优化详解

    一 运行时优化 Grappler是TensorFlow提供的运行时优化功能 xff0c 图1为Grappler模块主要功能的UML关系图 其中tensorflow grappler GrapplerItem 表示待优化的TensforFlo
  • 理解一维数组中 buf、buf[0]、&buf[0]、&buf 四个符号的含义

    本文内容摘自 C语言内核深度解析 一书的深入学习数组部分 以 int buf 100 61 0 为例 xff0c 集中讨论 buf buf 0 amp buf 0 amp buf 四个字符含义的内涵 1 buf xff1a 有两层含义 xf
  • 无人机航线规划软件[航线通]

    无人机航线规划软件 航线通 xff08 RoutePlan xff09 是数据禾 xff08 databox store xff09 研发的具有自主知识产权的无人机航线规划及飞行的移动端控制软件 xff0c 主要适用于大疆无人机 xff0c
  • Ubuntu20.04安装Cartographer_ros,conda环境X11问题

    absl的解决 conda 环境的 X11 问题 xff1a conda span class token function install span c conda forge xorg libx11
  • 单目视觉定位测距的两种方式

    单目定位和双目定位的选择 xff0c 我觉得主要还是成本和时间的考虑 之前也尝试过双目定位 xff0c 感觉要更精准些 xff0c 但双目测距需要对两幅图像进行图像变换和极线匹配 xff0c 稍微耗时了一些 这几天尝试了一下单摄像头进行测距
  • KY-RTI分布仿真技术:附录3 国产化(操作系统+CPUs)

    以操作系统和CPU为代表的国产化是当前仿真系统实现的必然趋势 本章以聊天程序为例 xff0c 展示了KY RTI在多种国产操作系统和国产CPU上的运行结果 聊天程序是一个入门程序 xff0c 本身比较简单 xff0c 不追求界面的美观 相信
  • KY-RTI分布仿真技术:前言

    前 言 自从美国国防部建模与仿真办公室 xff08 DMSO xff09 首次提出高层体系结构 xff08 High Level Architecture xff0c HLA xff09 概念以来 xff0c HLA仿真技术得到了迅猛发展
  • KY-RTI分布仿真技术:第一章 简介

    第一章 简介 高层体系结构 xff08 High Level Architecture xff0c HLA xff09 是美国国防部为了解决美军在各个领域开发出来的多种模型和各类仿真系统的互联和互操作问题而提出的一种分布式仿真标准 xff0
  • KY-RTI分布仿真技术:第二章 系统安装

    第二章 系统安装 本章介绍KY RTI在Linux和Windows操作系统下的安装方法 2 1 Linux安装 安装程序 xff1a RTI 1 3NGv6 tar gz 假设当前的Linux用户名为lbq xff0c HOME目录为 ho
  • KY-RTI分布仿真技术:第三章 KY-OMT对象模型模板工具

    第三章 KY OMT对象模型模板工具 本章介绍了对象模型模板的相关知识 xff0c 以及如何使用KY OMT对象模型模板工具创建对象模型文件 3 1 对象模型模板 HLA1 3包含3个标准 xff0c 第一个是描述整个联邦和联邦成员必须遵循
  • 基于SSM的后台管理系统总结

    文章目录 SSM环境搭建环境准备1 1 数据库与表结构1 2 maven工程搭建 pom 1 3编写实体类编写接口 SSM整合 web 与产品查询Spring环境搭建web xml 配置Spring MVC 环境搭建测试运行 资源地址 首先
  • KY-RTI分布仿真技术:第四章 C++程序设计

    第四章 C 43 43 程序设计 本章讲述如何在Linux操作系统上设计GNU C 43 43 程序 演示了2个程序 xff1a 聊天程序chat和时间管理程序time chat使用HLA的交互类进行通信 xff0c 没有采用tick服务
  • KY-RTI分布仿真技术:第五章 Qt程序设计

    第五章 Qt程序设计 本章讲述了如何基于Qt Creator设计控制台程序和图形界面程序 控制台程序相当于4 3节的聊天程序 xff1b 图形界面程序相当于4 4节的时间管理程序 图形界面程序近似于真实仿真项目 xff0c 讲述了如何设计仿
  • KY-RTI分布仿真技术:第六章 Java程序设计

    第六章 Java程序设计 本章讲述了如何基于Java设计聊天程序和时间管理程序 xff0c 两个程序都是控制台程序 聊天程序相当于4 3节的GNU C 43 43 聊天程序 xff1b 时间管理程序相当于4 4节的GNU C 43 43 程
  • KY-RTI分布仿真技术:第七章 Visual C++程序设计

    第七章 Visual C 43 43 程序设计 本章讲述如何基于Visual C 43 43 设计仿真程序 演示了2个程序 xff1a ping程序和pong程序进行相互之间的通信 程序使用HLA的交互类进行通信 xff0c Visual