Command Agent

From OO Lab
Jump to: navigation, search

Author: J.C

Back


Contents

Introduction

Minerva?傳到DIVA Server Thread的指令,將會被轉交至Command Agent處理

換句話說,Command Agent就像是一個功能強大的指令集

Brief

由於Command Agent使用Singleton? Pattern,加上Command Agent本身是指令集

所以本身不會有太明顯的程式進入點與執行順序

我們使用bt.java做為Test Case後,發現會觸發Command Agent的建構子是在以下的程式碼片段中

在Main\DIVA_Main.cpp

unsigned __stdcall createSever(void*) {
   /// 建立server thread port 2000, 容許同時5連線
   SocketServer in(2000,5);
   /// 接收連線
   Socket* s=in.Accept();
   while (1) {
     std::string r = s->ReceiveLine();
     assert(r.length() > 0);
     /// 先以換行為分隔 再以空格為分隔
     std::vector<std::string> returnMsg = Command_Agent::getInstance()->stringSplit(r,NEWLINE);
     returnMsg = Command_Agent::getInstance()->stringSplit(*(returnMsg.begin()),BLANK);

這裡面的Command_Agent::getInstance()->stringSplit()會使得Command Agent初始化

Propose

這份文件主要幫助理解,在不同的source code中,可能會轉呼叫到Command Agent的情況

大致上包括WOP Entries、WOPM、DIVA_KeyFrame、DIVA_FrameListener、InterpolationCenter?…等

但是由於在大多數的情況下,任何操作都有機會間接轉呼叫到Command Agent

因此建議各位都Trace這一部份


Trace Progress

在這個過程中,我們將會使用bt.java作為test case

首先先執行Minerva,如下圖設定中斷點,並且視覺化「root」

再按下確定後,DIVA Server Thread會收到"visualize root"的字串

並且呼叫Command_Agent的stringSplit()切割此字串 Visualize@Minerva.png

in source file 「Command_Agent\Command_Agent.cpp」

1. Initialize

  • 如Brief所述,該段程式碼會呼叫Line142的getInstance()
  • 由於第一次執行,ca還是NULL,所以呼叫Line126的建構子
  • Line145~151: 在建立物件後,把原生型態(PrimaryType?)的代表字塞到vector中備用(之後被使用於isPriType()檢查)

Command Agent@Command Agent.png

  • std::vector<string> stringSplit(std::string 欲分割的字串, std::string 分割符號);

這個函式較簡單,因此不特別說明

2. Visualize

Visualize@Command Agent.png

Reference

  1. The major thread in DIVA
  2. xMappingTree
  3. MDS
  4. Singleton Pattern
Personal tools