The major threads in DIVA and how it interacts with Minerva
From OO Lab
GRADE C Please follow the template
- Author: J.C
- Back
Contents |
Introduction
這份文件在說明DIVA主程式如何啟動Server Thread
接受來自Minerva?的命令並且轉請Command_Agent處理指令
Brief
在Main\DIVA_Main.cpp中,有一個函式
unsigned __stdcall createSever(void*)
這個函式將會在WinMain()中,被_beginthreadex()這一個函式當作參數參考到
而_beginthreadex()會轉呼叫Win32 API的CreateThread()來建立Thread
另外,這個function僅單向處理Minerva傳遞過來的command
更進一步的雙向溝通,或是取得更detail的debug data,是透過Command_Agent裡的ClientSocket取得
createSever應該是錯字- _beginthreadex()與CreateThread()都要求,被傳入的function要加上__stdcall Calling Conventions,而不是用&(by ref)來傳址
Propose
所有DIVA開發者都需要瞭解這一部份的程式碼
因為這一部份是DIVA端主要的資料輸入來源,除了使用者對Orge UI的控制之外,所有的指令都是從這裡觸發的
Trace Progress
在這個過程中,我們將會使用bt.java作為test case
in source file 「Main\DIVA_Main.cpp」
1. Entrypoint
- 主程式從Line71: WinMain?()開始
- Line78: _beginthreadex(),main thread繼續執行,建立DIVA視窗;另一方面,新建立的Thread從Line24: createSever()開始 (以下只討論新建立的thread的情況)
2. Initialize Socket
- Line27: 建立了SocketServer obj,因為初始化時沒有指定第3個參數,因此使用default value 「BlockingSocket?」
- Line30: 因為是BlockingSocket的關係,本Thread會Block住,直到有連線進來,成功accept為止
- 一直要等到Minerva開始執行,停在中斷點,並且「Visualize」的時候,才會建立連線。如下圖,按下「確定」後才會建立連線
- 而DIVA這方,accept連線後,會開始執行Line32~67之間的無窮迴圈
3. Receive Data
- Line33: 在本例中,因為在Minerva中,按下Visualize鈕,並且填入「root」,所以這裡會收到字串"visualize root"
- Line37~38: 剖析字串,"visualize root"被分解為"visualize"、"root",並放在returnMsg這個vector裡
- Line43: 剖析指令,因為visual符合這一行,所以會進行這一個section的指令
- Line45~47: 呼叫DIVA_Manager把animation mutex鎖住,進入CS。並轉請Command_Agent來處理"visualize"指令,參數是itr指向的下一個元素,也就是"root"。處理完成後再釋放mutex
4. Update
- 若在DIVA的介面上按下next或step,將會促使Minerva移動執行位置,又會在Line33處收到字串"update"。原則上只要Minerva的現正執行位置改變,都會送出"update"
- Line62~66: 與上述處理visualize的方式差不多,處理update指令