The major threads in DIVA and how it interacts with Minerva

From OO Lab
Jump to: navigation, search

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的情況)

WinMain@DIVA Main.png

2. Initialize Socket

  • Line27: 建立了SocketServer obj,因為初始化時沒有指定第3個參數,因此使用default value 「BlockingSocket?」
  • Line30: 因為是BlockingSocket的關係,本Thread會Block住,直到有連線進來,成功accept為止
  • 一直要等到Minerva開始執行,停在中斷點,並且「Visualize」的時候,才會建立連線。如下圖,按下「確定」後才會建立連線
  • 而DIVA這方,accept連線後,會開始執行Line32~67之間的無窮迴圈

Visualize@Minerva.png


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

CreateSever@DIVA Main.png


4. Update

  • 若在DIVA的介面上按下next或step,將會促使Minerva移動執行位置,又會在Line33處收到字串"update"。原則上只要Minerva的現正執行位置改變,都會送出"update"
  • Line62~66: 與上述處理visualize的方式差不多,處理update指令


Reference

  1. minerva Minerva?
  2. Command_Agent
  3. __stdcall與__cdecl的區別
Personal tools