日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网狐棋牌(二) CQueueServiceEvent初步分析

發(fā)布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网狐棋牌(二) CQueueServiceEvent初步分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
相關(guān)UML:


代碼分析:
首先CQueueServiceEvent這個名字很有誘惑,,,你感覺他是一個事件,其實不是。它實際的功能應(yīng)該是一個帶打包功能的事件隊列,,,或者說是一個像指定的類似EventQueue的東東中投遞事件。從接口上看,這個東東能投遞TimerEvent? DataBaseEvent? SocketAcceptEvent? SocketReadEvent? SocketCloseEvent
應(yīng)為它本身持有一個CQueueService指針,所以本身并不負(fù)責(zé)數(shù)據(jù)管理,只負(fù)責(zé)打包并添加到CQueueService實例中去。

先看定時器事件:
?1????//定時器事件
?2????bool?PostTimerEvent(WORD?wTimerID,?WPARAM?wBindParam)
?3????{
?4????????//效驗參數(shù)
?5????????ASSERT(m_pIQueueService!=NULL);
?6????????if?(m_pIQueueService==NULL)?return?false;
?7
?8????????//緩沖鎖定
?9????????CThreadLockHandle?BufferLockHandle(&m_BufferLock);
10
11????????//投遞消息
12????????NTY_TimerEvent?*?pTimerEvent=(NTY_TimerEvent?*)m_cbBuffer;
13????????pTimerEvent->wTimerID=wTimerID;
14????????pTimerEvent->wBindParam=wBindParam;
15????????m_pIQueueService->AddToQueue(EVENT_TIMER,m_cbBuffer,sizeof(NTY_TimerEvent));
16
17????????return?true;
18????}
嗯哼,代碼質(zhì)量很高哈,,,
入口都有斷言在debug階段幫助暴露錯誤,斷言之后還有if語句再次判斷,這樣即使release版本錯誤也不會被漏掉,,,
關(guān)于事件的封裝,在這里其實已經(jīng)分層了,,,

這里是第一層:
1struct?tagDataHead
2{
3????WORD????????????????????????????wDataSize;????????????????????????????//數(shù)據(jù)大小
4????WORD????????????????????????????wIdentifier;????????????????????????//類型標(biāo)識
5????DWORD????????????????????????????dwInsertTime;????????????????????????//插入時間
6}
; 這一層實際上是由CDataStorage負(fù)責(zé)打包管理,在CQueueServiceEvent執(zhí)行PostTimerEvent操作的時候會在內(nèi)部調(diào)用CQueueService的add最終調(diào)用到CDataStrorage的Add來打包數(shù)據(jù),這里的結(jié)構(gòu)也是非常像網(wǎng)絡(luò)數(shù)據(jù)包|-?len -|-?type -|-?data -|。
在來看Post這一層做的數(shù)據(jù)打包:
1//定時器事件
2struct?NTY_TimerEvent
3{
4????WORD????????????????????????????wTimerID;????????????????????????????//定時器?ID
5????WPARAM????????????????????????????wBindParam;????????????????????????????//綁定參數(shù)
6}
; |- len -|- type -|-?sub protocl?-|。
其他事件的打包過程都是類似的:
?1//數(shù)據(jù)庫請求事件
?2struct?NTY_DataBaseEvent
?3{
?4????WORD????????????????????????????wIndex;????????????????????????????????//對象索引
?5????WORD????????????????????????????wRoundID;????????????????????????????//對象標(biāo)識
?6????WORD????????????????????????????wRequestID;????????????????????????????//請求標(biāo)識
?7}
;
?8
?9//網(wǎng)絡(luò)應(yīng)答事件
10struct?NTY_SocketAcceptEvent
11{
12????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
13????WORD????????????????????????????wRoundID;????????????????????????????//連接標(biāo)識
14????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
15}
;
16
17//網(wǎng)絡(luò)讀取事件
18struct?NTY_SocketReadEvent
19{
20????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
21????WORD????????????????????????????wRoundID;????????????????????????????//連接標(biāo)識
22????WORD????????????????????????????wDataSize;????????????????????????????//數(shù)據(jù)大小
23????CMD_Command????????????????????????Command;????????????????????????????//命令信息
24}
;
25
26//網(wǎng)絡(luò)關(guān)閉事件
27struct?NTY_SocketCloseEvent
28{
29????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
30????WORD????????????????????????????wRoundID;????????????????????????????//連接標(biāo)識
31????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
32????DWORD????????????????????????????dwConnectSecond;????????????????????//連接時間
33}
;

還是一樣,一句話總結(jié)CQueueServiceEvent:

線程安全的接受各種異步事件,并打包封裝好以后插入到關(guān)聯(lián)的制定IQueueService中.

轉(zhuǎn)自:http://www.cppblog.com/Error/articles/147948.html

總結(jié)

以上是生活随笔為你收集整理的网狐棋牌(二) CQueueServiceEvent初步分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。