Command Agent
From OO Lab
(Difference between revisions)
(→Reference) |
Latest revision as of 16:22, 30 January 2012
Author: J.C
Contents |
[edit] Introduction
從Minerva?傳到DIVA Server Thread的指令,將會被轉交至Command Agent處理
換句話說,Command Agent就像是一個功能強大的指令集
[edit] 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初始化
[edit] Propose
這份文件主要幫助理解,在不同的source code中,可能會轉呼叫到Command Agent的情況
大致上包括WOP Entries、WOPM、DIVA_KeyFrame、DIVA_FrameListener、InterpolationCenter?…等
但是由於在大多數的情況下,任何操作都有機會間接轉呼叫到Command Agent
因此建議各位都Trace這一部份
[edit] Trace Progress
在這個過程中,我們將會使用bt.java作為test case
首先先執行Minerva,如下圖設定中斷點,並且視覺化「root」
再按下確定後,DIVA Server Thread會收到"visualize root"的字串
並且呼叫Command_Agent的stringSplit()切割此字串
in source file 「Command_Agent\Command_Agent.cpp」
[edit] 1. Initialize
- 如Brief所述,該段程式碼會呼叫Line142的getInstance()
- 由於第一次執行,ca還是NULL,所以呼叫Line126的建構子
- Line145~151: 在建立物件後,把原生型態(PrimaryType?)的代表字塞到vector中備用(之後被使用於isPriType()檢查)
- std::vector<string> stringSplit(std::string 欲分割的字串, std::string 分割符號);
這個函式較簡單,因此不特別說明