這一篇來聊一聊如何開發(fā)基于QP的應(yīng)用程序,他可能和我們平時(shí)開發(fā)的應(yīng)用程序所遵循的規(guī)則不太一樣,其實(shí)規(guī)則一詞有點(diǎn)別扭,不如說是套路,每個(gè)人開發(fā)軟件都有自己的套路,每個(gè)套路都是你站在問題需求的一個(gè)角度上理解以后,產(chǎn)生的策略,問題需求的角度不同,你能產(chǎn)生的策略就不一樣,不要站在一個(gè)套路的高度,嘗試著把軟件融入到另一種套路中,一切重新從需求出發(fā),問題會(huì)變得更簡(jiǎn)單。
QP這本書提了兩點(diǎn)要求我們必須遵守的準(zhǔn)則,并且用了很大的篇幅去說服你一定要遵守這兩條準(zhǔn)則:
準(zhǔn)則一、活動(dòng)對(duì)象之間僅應(yīng)該通過異步事件交換來相互作用,不應(yīng)該共享內(nèi)存或者其它資源。(通俗舉例:取消全局變量)
準(zhǔn)則二、活動(dòng)對(duì)象不應(yīng)該被阻塞或者在RTC處理中間忙等待事件。(通俗來講:不太好講,大概是活動(dòng)對(duì)象內(nèi)部處理代碼不要有死等或者被掛起的操作)
知道這兩條規(guī)則,你依舊是寫不好QP的應(yīng)用,就像是懂得了很多大道理卻依舊過不好這一生(扯遠(yuǎn)了),規(guī)則的目的,不是讓你僅僅停留在理解的階段,而是要在今后的實(shí)戰(zhàn)應(yīng)用中,不斷地實(shí)踐,不斷的進(jìn)階,才會(huì)獲得更好的理解(莫要怕犯錯(cuò),不犯錯(cuò)你就永遠(yuǎn)無法掌握它)。
這兩條規(guī)則都在圍繞著一個(gè)核心的主題來,也就是【活動(dòng)對(duì)象】,他爹就是【狀態(tài)機(jī)】,時(shí)代變了,很難靠狀態(tài)機(jī)來打天下了,必須要披上一層QF的糖衣,這樣生意就好做多了,QF提供了事件隊(duì)列,內(nèi)存池等等一系列的基礎(chǔ)設(shè)施給狀態(tài)機(jī)使用,同樣,用上了這些高端貨的狀態(tài)機(jī),已經(jīng)不能叫做狀態(tài)機(jī)了,于是,他有了另一個(gè)喜人的名字【活動(dòng)對(duì)象】。
一個(gè)基于QP的應(yīng)用程序,實(shí)際上是被分割成了多個(gè)【活動(dòng)對(duì)象】,每個(gè)活動(dòng)對(duì)象都為系統(tǒng)管理一部分【資源】,資源這個(gè)詞很有意思,看到管理資源,第一時(shí)間可能想到的是管理內(nèi)存,其實(shí)在活動(dòng)對(duì)象看來,不光是一片內(nèi)存叫資源,兩個(gè)IO引腳,一個(gè)LED燈都可以叫做是資源,如何實(shí)現(xiàn)應(yīng)用,其實(shí)就是靠管理這些資源協(xié)調(diào)運(yùn)作,從而實(shí)現(xiàn)應(yīng)用的功能。
又扯遠(yuǎn)了,【活動(dòng)對(duì)象】的本職就是管理資源,他們高度的自治,就是我管的事情別人不可以插手,那么如何協(xié)調(diào)工作呢,那就需要一個(gè)叫做【事件】的郵件,你想改變某個(gè)資源,對(duì)不起,發(fā)郵件告訴我。什么?你很急?哦,那你趕緊寫郵件?。ù蠹冶仨氉袷匾?guī)則,不然又回到了全局變量滿地找的解放前)~!
整個(gè)應(yīng)用程序功能可以很復(fù)雜,有可能很多活最終都分配給某個(gè)【活動(dòng)對(duì)象】,其它的【活動(dòng)對(duì)象】就很閑,是不是會(huì)讓你想起ARM打天下的場(chǎng)景,嘿嘿~!這就要看作者的創(chuàng)作水平了,這個(gè)叫【某個(gè)】的【活動(dòng)對(duì)象】變得很忙,其他人都在聊天打屁,還時(shí)不時(shí)給他發(fā)郵件,讓他干這干那,他倒是任勞任怨,但是好多郵件到家門口的時(shí)候,他可能在忙,于是郵遞員【QF】把郵件放到他家門口,敲門就走了,這貨現(xiàn)在忙得跟孫子似的,根本沒時(shí)間開門接郵件,結(jié)果一陣大風(fēng)刮過,他開門的時(shí)候啥也沒了。整個(gè)應(yīng)用到這里就凌亂了。
為了解決這個(gè)問題,于是乎,QF就給每個(gè)【活動(dòng)對(duì)象】在他們家門口都按了一個(gè)箱子,叫郵箱(這個(gè)郵箱是真實(shí)生活中的郵箱,可不是操作系統(tǒng)概念中的郵箱)【事件隊(duì)列】,于是乎,這個(gè)問題仿佛得到了一部分解決,快遞員每次來的時(shí)候,就把郵件放到你的郵箱里,然后敲門離開,當(dāng)然也會(huì)遇到一種特殊情況,郵件太多,實(shí)在放不下了(一個(gè)合適大小的事件隊(duì)列有多重要,只能等你實(shí)戰(zhàn)的時(shí)候體會(huì)了),這時(shí)候,快遞小哥只能把郵件放在門口,敲門離開,繼續(xù)送信,小心大風(fēng)~!
針對(duì)這個(gè)寫的郵件【事件】,還有一個(gè)重要的方面沒講,也就是【活動(dòng)對(duì)象】能處理的郵件的要求是受限,你不能寫個(gè)郵件【事件】,內(nèi)容是幫我造一顆原子彈,這時(shí)候【活動(dòng)對(duì)象】可能懶得理你,也可能和警察【QF】報(bào)告抓你,為了防止惡作劇的存在,于是大家規(guī)定了一整套的【事件】類型的定義,叫做【信號(hào)】,通過枚舉來完成,確保大家都不同。
到這里已經(jīng)引出了本篇的所有主題,你要開發(fā)QP應(yīng)用程序,就必須將他分解成多個(gè)【活動(dòng)對(duì)象】,并用【事件】機(jī)制將他們串起來,這個(gè)復(fù)雜的機(jī)制又引入了【信號(hào)】、【事件隊(duì)列】等等內(nèi)容。
于是總結(jié)一下:
QP應(yīng)用程序 = 多個(gè)【活動(dòng)對(duì)象】+【信號(hào)】+【事件】+【事件隊(duì)列】;
【活動(dòng)對(duì)象】是可以展開的,展開就是狀態(tài)機(jī),如何基于狀態(tài)機(jī)開發(fā)應(yīng)用程序的專題我寫了,所以這里就不展開了。
下一篇,教你如何分解成活動(dòng)對(duì)象,基于一個(gè)官方的實(shí)例,從問題需求,到順序圖,到活動(dòng)對(duì)象一條龍。再見~!