實(shí)際開發(fā)過程中,是利用QM工具構(gòu)架狀態(tài)圖,并生成活動對象源碼,在這里我們通過逆向的角度,已經(jīng)有了ship活動對象源碼的情況下,來分析一下他來自于QM的哪個部分,最后我們自建一個qm的工程一步一步添加代碼,生成整個工程。
這完整的QM工程和由QM工程所生成的源碼文件對比如下:
活動對象的底層原型就是一個狀態(tài)機(jī):QActive 就是 QHsm~!
對于狀態(tài)機(jī)由兩部分組成:內(nèi)部成員和狀態(tài)圖。
內(nèi)部成員構(gòu)成類比于對象的屬性:
狀態(tài)圖主要描述狀態(tài)的遷移以及對不同狀態(tài)對于相同事件,
做出不同的反應(yīng),核心在于狀態(tài)的分析:
有了狀態(tài)的分析,接下來看一下那些觸發(fā)轉(zhuǎn)換的事件,初始轉(zhuǎn)換已經(jīng)在上圖中標(biāo)出,這里 不再重復(fù),所有帶箭頭的折線代表著轉(zhuǎn)換,而每個轉(zhuǎn)換皆有事件觸發(fā):
事件的作用一部分是用來觸發(fā)狀態(tài)轉(zhuǎn)換,另一部分用于狀態(tài)內(nèi)部處理,并不觸發(fā)狀態(tài)轉(zhuǎn)換:
借助QM構(gòu)建工具,讓ship狀態(tài)機(jī)的流程變得更加的清晰,其實(shí)大部分的代碼都是由QM工具幫我們生成的,這并不帶代表著QM能夠自動生成所有的代碼細(xì)節(jié),而是幫我們搭好了狀態(tài)機(jī)的框架,利用框架進(jìn)行代碼定位更加清晰。
基于QM從零開始構(gòu)建ship活動對象:
創(chuàng)建一個.C文件,輸入獨(dú)特的命令行:$declare${AOs::Ship}
點(diǎn)擊執(zhí)行生成代碼:
打開你QM的工程目錄,然后對比一下QM工程中狀態(tài)機(jī)的樣子,一個是圖形化樣子,一個是完全可以執(zhí)行的代碼。
接著輸入命令展開狀態(tài)機(jī)定義$define${AOs::Ship}:
此外狀態(tài)機(jī)還需要一個給外部框架調(diào)用運(yùn)行的指針,他是一個QActive類型的通用指針,需要單獨(dú)定義及變換。
要啟動一個狀態(tài)機(jī)之前,除了擁有了其通用活動對象指針以外,還需要一個構(gòu)造函數(shù):
真正要讓這個狀態(tài)機(jī)跑起來,就需要在main函數(shù)中,調(diào)用構(gòu)造函數(shù)對其進(jìn)行構(gòu)造,并調(diào)用框架提供的START函數(shù),讓他真正的運(yùn)行起來:
到這里關(guān)于QM與活動對象Ship之間的愛恨糾葛就結(jié)束了,一個應(yīng)用需要多個活動對象協(xié)調(diào)運(yùn)轉(zhuǎn),后面不會展開這么細(xì)致的去分析QM與活動對象, 而是站在QM的角度來看待整個應(yīng)用,他或許是一扇新的窗,希望會有陽光。