基于狀態(tài)機(jī)進(jìn)行實(shí)際應(yīng)用的時(shí)候,會(huì)感覺(jué)有些力不從心,因?yàn)橐粋€(gè)應(yīng)用通常會(huì)被分解為多個(gè)狀態(tài)機(jī)。這些狀態(tài)機(jī)之間如何完成協(xié)作的,如何完成通信,優(yōu)先級(jí)排列,事件派發(fā),隊(duì)列存儲(chǔ)等等,這些需求在狀態(tài)機(jī)中并沒(méi)有做支持,QF的存在就對(duì)這一情況做了很好的補(bǔ)充。并引入了對(duì)象計(jì)算模式,抽象出了活動(dòng)對(duì)象:一個(gè)對(duì)象擁有自己的控制線(xiàn)程,稱(chēng)為活動(dòng)對(duì)象。
在多任務(wù)操作系統(tǒng)當(dāng)中,每個(gè)活動(dòng)對(duì)象都是保持自治的,擁有自己的控制線(xiàn)程(事件循環(huán)) 、事件隊(duì)列 、狀態(tài)機(jī)。也可以這樣理解,在多任務(wù)操作環(huán)境里,使用多個(gè)事件驅(qū)動(dòng)型操作系統(tǒng)(簡(jiǎn)單理解:一個(gè)活動(dòng)對(duì)象可以當(dāng)做一個(gè)單獨(dú)的事件驅(qū)動(dòng)型系統(tǒng))。
活動(dòng)對(duì)象在源碼中的定義,如下:
針對(duì)控制線(xiàn)程還想再多說(shuō)一些,并不是所有的活動(dòng)對(duì)象都需要自帶控制線(xiàn)程,當(dāng)僅適用qf框架服務(wù)時(shí),一個(gè)名為QV的合作式內(nèi)核來(lái)解決所有的活動(dòng)對(duì)象的控制線(xiàn)程的問(wèn)題,因?yàn)榇蠹业牟僮鞫际且粯拥模@取事件、分發(fā)事件、處理事件(所以它被從活動(dòng)對(duì)象中抽了出來(lái)了)下圖是簡(jiǎn)化版的活動(dòng)對(duì)象的系統(tǒng)及事件循環(huán):
以活動(dòng)對(duì)象為核心的應(yīng)用程序開(kāi)發(fā),活動(dòng)對(duì)象其服務(wù)的提供,可能來(lái)源于兩部分,QF框架和RTOS系統(tǒng)。從另一個(gè)角度我們來(lái)看一下,應(yīng)用,QF框架,RTOS系統(tǒng)之間的關(guān)系,如圖:
從圖中可以看到他們的關(guān)系,有一點(diǎn)還想要說(shuō)一下,QF框架的本質(zhì)是提供服務(wù)的,他的下面可以有RTOS也可以沒(méi)有,那么問(wèn)題就來(lái)了,如果底層是RTOS,那么QF可以借用他的一些服務(wù),例如消息隊(duì)列,例如內(nèi)存管理等。假如QF的下面就是裸機(jī)。那么關(guān)于他需要的資源就需要他自己實(shí)現(xiàn)了,例如一顆合作式的內(nèi)核QV就可能被集成到QF上,關(guān)于QV合作式內(nèi)核后面單獨(dú)聊吧。
活動(dòng)對(duì)象在應(yīng)用過(guò)程中,你需要理解他最核心的三個(gè)設(shè)定:
1. 異步通訊,活動(dòng)對(duì)象擁有自己的事件隊(duì)列,并且通過(guò)從事件隊(duì)列中獲取事件,所以事件都是被異步投遞的,站在事件生產(chǎn)者的角度,異步通訊就意味著,他只負(fù)責(zé)生產(chǎn)一個(gè)事件,并將其發(fā)送給相應(yīng)的活動(dòng)對(duì)象,并不原地等待事件的處理。
2. RTC————運(yùn)行到完成,也就是運(yùn)行到完成的過(guò)程中不被打斷,這么說(shuō)還是比較模糊的,正確的理解應(yīng)該是,狀態(tài)機(jī)在處理一個(gè)事件的過(guò)程中,不會(huì)去接收和處理其它事件,只有等這個(gè)事件處理完了,才可以去處理其它事件。這個(gè)過(guò)程是不會(huì)被打斷的。
3. 封裝,這個(gè)可能是活動(dòng)對(duì)象最重要的概念,其實(shí)應(yīng)該是面向?qū)ο蟮母拍睿庋b意味著不共享數(shù)據(jù)和其它任意資源。
接下來(lái)進(jìn)入實(shí)戰(zhàn)部分,這一部分不要看源碼了,源碼太精彩了,后面單獨(dú)拉出來(lái)給大家分析分析,原來(lái)C語(yǔ)言可以這么玩,基于QP6.9.1開(kāi)發(fā)者文檔中中找到關(guān)于活動(dòng)對(duì)象相關(guān)的API函數(shù),并分析一下其函數(shù)功能、參數(shù)、及返回值:
關(guān)于如何創(chuàng)建一個(gè)活動(dòng)對(duì)象并啟動(dòng)對(duì)應(yīng)的活動(dòng)對(duì)象步驟,如下:
1. 定義具體的活動(dòng)對(duì)象類(lèi)型(類(lèi)比于定義結(jié)構(gòu)體類(lèi)型),如下:
2.有了類(lèi)型以后,實(shí)例化活動(dòng)對(duì)象(類(lèi)似于創(chuàng)建變量),如下:
3.構(gòu)造活動(dòng)對(duì)象(類(lèi)比于變量初始化),如下:
4.啟動(dòng)活動(dòng)對(duì)象(類(lèi)比喻執(zhí)行Table_intial函數(shù)),如下:
5.停止活動(dòng)對(duì)象相關(guān)操作并沒(méi)有顯示的調(diào)用,表明這個(gè)應(yīng)用不需要停止活動(dòng)對(duì)象。