相關UML:

代碼分析:
首先CQueueServiceEvent這個名字很有誘惑,,,你感覺他是一個事件,其實不是。它實際的功能應該是一個帶打包功能的事件隊列,,,或者說是一個像指定的類似EventQueue的東東中投遞事件。從接口上看,這個東東能投遞TimerEvent DataBaseEvent SocketAcceptEvent SocketReadEvent SocketCloseEvent
應為它本身持有一個CQueueService指針,所以本身并不負責數據管理,只負責打包并添加到CQueueService實例中去。
先看定時器事件:
入口都有斷言在debug階段幫助暴露錯誤,斷言之后還有if語句再次判斷,這樣即使release版本錯誤也不會被漏掉,,,
關于事件的封裝,在這里其實已經分層了,,,
這里是第一層:
在來看Post這一層做的數據打包:
其他事件的打包過程都是類似的:
還是一樣,一句話總結CQueueServiceEvent:
線程安全的接受各種異步事件,并打包封裝好以后插入到關聯的制定IQueueService中.

代碼分析:
首先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
}
嗯哼,代碼質量很高哈,,,
2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

入口都有斷言在debug階段幫助暴露錯誤,斷言之后還有if語句再次判斷,這樣即使release版本錯誤也不會被漏掉,,,
關于事件的封裝,在這里其實已經分層了,,,
這里是第一層:
1
struct tagDataHead
2
{
3
WORD wDataSize; //數據大小
4
WORD wIdentifier; //類型標識
5
DWORD dwInsertTime; //插入時間
6
};
這一層實際上是由CDataStorage負責打包管理,在CQueueServiceEvent執行PostTimerEvent操作的時候會在內部調用CQueueService的add最終調用到CDataStrorage的Add來打包數據,這里的結構也是非常像網絡數據包|- len -|- type -|- data -|。
2

3

4

5

6

在來看Post這一層做的數據打包:
1
//定時器事件
2
struct NTY_TimerEvent
3
{
4
WORD wTimerID; //定時器 ID
5
WPARAM wBindParam; //綁定參數
6
};
|- len -|- type -|- sub protocl -|。
2

3

4

5

6

其他事件的打包過程都是類似的:
1
//數據庫請求事件
2
struct NTY_DataBaseEvent
3
{
4
WORD wIndex; //對象索引
5
WORD wRoundID; //對象標識
6
WORD wRequestID; //請求標識
7
};
8
9
//網絡應答事件
10
struct NTY_SocketAcceptEvent
11
{
12
WORD wIndex; //連接索引
13
WORD wRoundID; //連接標識
14
DWORD dwClientIP; //連接地址
15
};
16
17
//網絡讀取事件
18
struct NTY_SocketReadEvent
19
{
20
WORD wIndex; //連接索引
21
WORD wRoundID; //連接標識
22
WORD wDataSize; //數據大小
23
CMD_Command Command; //命令信息
24
};
25
26
//網絡關閉事件
27
struct NTY_SocketCloseEvent
28
{
29
WORD wIndex; //連接索引
30
WORD wRoundID; //連接標識
31
DWORD dwClientIP; //連接地址
32
DWORD dwConnectSecond; //連接時間
33
};

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

還是一樣,一句話總結CQueueServiceEvent:
線程安全的接受各種異步事件,并打包封裝好以后插入到關聯的制定IQueueService中.