网狐棋牌(二) CQueueServiceEvent初步分析
生活随笔
收集整理的這篇文章主要介紹了
网狐棋牌(二) CQueueServiceEvent初步分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
相關UML:
代碼分析:
首先CQueueServiceEvent這個名字很有誘惑,,,你感覺他是一個事件,其實不是。它實際的功能應該是一個帶打包功能的事件隊列,,,或者說是一個像指定的類似EventQueue的東東中投遞事件。從接口上看,這個東東能投遞TimerEvent? DataBaseEvent? SocketAcceptEvent? SocketReadEvent? SocketCloseEvent
應為它本身持有一個CQueueService指針,所以本身并不負責數據管理,只負責打包并添加到CQueueService實例中去。
先看定時器事件: ?1????//定時器事件
?2????bool?PostTimerEvent(WORD?wTimerID,?WPARAM?wBindParam)
?3????{
?4????????//效驗參數
?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????} 嗯哼,代碼質量很高哈,,,
入口都有斷言在debug階段幫助暴露錯誤,斷言之后還有if語句再次判斷,這樣即使release版本錯誤也不會被漏掉,,,
關于事件的封裝,在這里其實已經分層了,,,
這里是第一層:
1struct?tagDataHead
2{
3????WORD????????????????????????????wDataSize;????????????????????????????//數據大小
4????WORD????????????????????????????wIdentifier;????????????????????????//類型標識
5????DWORD????????????????????????????dwInsertTime;????????????????????????//插入時間
6}; 這一層實際上是由CDataStorage負責打包管理,在CQueueServiceEvent執行PostTimerEvent操作的時候會在內部調用CQueueService的add最終調用到CDataStrorage的Add來打包數據,這里的結構也是非常像網絡數據包|-?len -|-?type -|-?data -|。
在來看Post這一層做的數據打包:
1//定時器事件
2struct?NTY_TimerEvent
3{
4????WORD????????????????????????????wTimerID;????????????????????????????//定時器?ID
5????WPARAM????????????????????????????wBindParam;????????????????????????????//綁定參數
6}; |- len -|- type -|-?sub protocl?-|。
其他事件的打包過程都是類似的:
?1//數據庫請求事件
?2struct?NTY_DataBaseEvent
?3{
?4????WORD????????????????????????????wIndex;????????????????????????????????//對象索引
?5????WORD????????????????????????????wRoundID;????????????????????????????//對象標識
?6????WORD????????????????????????????wRequestID;????????????????????????????//請求標識
?7};
?8
?9//網絡應答事件
10struct?NTY_SocketAcceptEvent
11{
12????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
13????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
14????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
15};
16
17//網絡讀取事件
18struct?NTY_SocketReadEvent
19{
20????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
21????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
22????WORD????????????????????????????wDataSize;????????????????????????????//數據大小
23????CMD_Command????????????????????????Command;????????????????????????????//命令信息
24};
25
26//網絡關閉事件
27struct?NTY_SocketCloseEvent
28{
29????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
30????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
31????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
32????DWORD????????????????????????????dwConnectSecond;????????????????????//連接時間
33};
還是一樣,一句話總結CQueueServiceEvent:
代碼分析:
首先CQueueServiceEvent這個名字很有誘惑,,,你感覺他是一個事件,其實不是。它實際的功能應該是一個帶打包功能的事件隊列,,,或者說是一個像指定的類似EventQueue的東東中投遞事件。從接口上看,這個東東能投遞TimerEvent? DataBaseEvent? SocketAcceptEvent? SocketReadEvent? SocketCloseEvent
應為它本身持有一個CQueueService指針,所以本身并不負責數據管理,只負責打包并添加到CQueueService實例中去。
先看定時器事件: ?1????//定時器事件
?2????bool?PostTimerEvent(WORD?wTimerID,?WPARAM?wBindParam)
?3????{
?4????????//效驗參數
?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????} 嗯哼,代碼質量很高哈,,,
入口都有斷言在debug階段幫助暴露錯誤,斷言之后還有if語句再次判斷,這樣即使release版本錯誤也不會被漏掉,,,
關于事件的封裝,在這里其實已經分層了,,,
這里是第一層:
1struct?tagDataHead
2{
3????WORD????????????????????????????wDataSize;????????????????????????????//數據大小
4????WORD????????????????????????????wIdentifier;????????????????????????//類型標識
5????DWORD????????????????????????????dwInsertTime;????????????????????????//插入時間
6}; 這一層實際上是由CDataStorage負責打包管理,在CQueueServiceEvent執行PostTimerEvent操作的時候會在內部調用CQueueService的add最終調用到CDataStrorage的Add來打包數據,這里的結構也是非常像網絡數據包|-?len -|-?type -|-?data -|。
在來看Post這一層做的數據打包:
1//定時器事件
2struct?NTY_TimerEvent
3{
4????WORD????????????????????????????wTimerID;????????????????????????????//定時器?ID
5????WPARAM????????????????????????????wBindParam;????????????????????????????//綁定參數
6}; |- len -|- type -|-?sub protocl?-|。
其他事件的打包過程都是類似的:
?1//數據庫請求事件
?2struct?NTY_DataBaseEvent
?3{
?4????WORD????????????????????????????wIndex;????????????????????????????????//對象索引
?5????WORD????????????????????????????wRoundID;????????????????????????????//對象標識
?6????WORD????????????????????????????wRequestID;????????????????????????????//請求標識
?7};
?8
?9//網絡應答事件
10struct?NTY_SocketAcceptEvent
11{
12????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
13????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
14????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
15};
16
17//網絡讀取事件
18struct?NTY_SocketReadEvent
19{
20????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
21????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
22????WORD????????????????????????????wDataSize;????????????????????????????//數據大小
23????CMD_Command????????????????????????Command;????????????????????????????//命令信息
24};
25
26//網絡關閉事件
27struct?NTY_SocketCloseEvent
28{
29????WORD????????????????????????????wIndex;????????????????????????????????//連接索引
30????WORD????????????????????????????wRoundID;????????????????????????????//連接標識
31????DWORD????????????????????????????dwClientIP;????????????????????????????//連接地址
32????DWORD????????????????????????????dwConnectSecond;????????????????????//連接時間
33};
還是一樣,一句話總結CQueueServiceEvent:
線程安全的接受各種異步事件,并打包封裝好以后插入到關聯的制定IQueueService中.
轉自:http://www.cppblog.com/Error/articles/147948.html
總結
以上是生活随笔為你收集整理的网狐棋牌(二) CQueueServiceEvent初步分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网狐棋牌(一) ServerKernel
- 下一篇: 网狐棋牌(三) 调度引擎初步分析