Error
C++博客
首页
新随笔
联系
聚合
管理
217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(5)
给我留言
查看公开留言
查看私人留言
随笔分类
《并发的艺术》(1)
agg(2)
android(2)
boost(3)
boost::asio(8)
boost::iostream(3)
C/C++技巧(9)
CEGUI
chromium(1)
cmake 莫纠结(2)
cocos2d-x(10)
cpp 1x and boost(1)
Duilib(3)
emacs学的不容易(1)
facebook: thrift(1)
gtest(1)
iocp(2)
java(2)
jsp(1)
linux(3)
lock free(1)
lua(3)
mysql(1)
OpenSsl(1)
oracle
python其实是shell(1)
QT(7)
SOUI源码分析
SQL(2)
websocket(1)
why programs fail - 系统优化调试指南(2)
win32 gui(2)
从零开始写棋牌游戏平台(60)
代码片段分享(2)
调试技术(1)
理解stl(2)
论坛大战(1)
没事瞎测测(1)
面试小算法(2)
面向模式的软件体系结构(1)
如何提炼代码
网狐棋牌源码分析(5)
为什么用boost(2)
学习、工作日志(1)
随笔档案
2017年10月 (1)
2017年7月 (1)
2017年6月 (2)
2017年5月 (1)
2017年4月 (5)
2017年3月 (6)
2017年1月 (1)
2016年12月 (9)
2016年10月 (1)
2016年7月 (2)
2016年3月 (3)
2016年2月 (1)
2015年11月 (1)
2015年9月 (3)
2015年8月 (5)
2015年7月 (2)
2015年6月 (4)
2015年5月 (6)
2015年4月 (7)
2015年3月 (5)
2015年2月 (1)
2015年1月 (8)
2014年12月 (4)
2014年11月 (4)
2014年10月 (6)
2014年9月 (3)
2014年8月 (3)
2014年7月 (1)
2014年6月 (4)
2014年5月 (2)
2014年4月 (3)
2014年3月 (2)
2014年2月 (9)
2014年1月 (17)
2013年12月 (7)
2013年10月 (6)
2013年8月 (3)
2013年7月 (4)
2013年5月 (1)
2013年4月 (10)
2013年3月 (12)
2013年2月 (4)
2012年12月 (4)
2012年11月 (8)
2012年10月 (7)
2012年9月 (3)
2012年8月 (2)
2012年7月 (5)
2012年6月 (5)
2011年9月 (1)
2011年7月 (1)
2011年5月 (1)
文章分类
about boost(3)
cmake 乱谈(2)
cygwin(3)
DirectUI - UIlib分析
FFMPEG的坑(1)
git(1)
google(1)
HGE 也来玩玩(1)
linux(3)
linux学习笔记
MySql(1)
oracle(1)
P2P(1)
socket(1)
stl陷阱与技巧(5)
SVN(1)
VC路上的坑(11)
windows 使用技巧(1)
WTL 征程(1)
XML(1)
高性能话题(1)
网狐棋牌源码分析(13)
无锁算法(1)
一步一个脚印学QT(6)
文章档案
2014年3月 (1)
2013年3月 (1)
2013年2月 (8)
2013年1月 (5)
2012年12月 (4)
2012年11月 (5)
2012年6月 (1)
2012年3月 (2)
2012年2月 (1)
2012年1月 (2)
2011年12月 (6)
2011年11月 (2)
2011年10月 (1)
2011年9月 (2)
2011年8月 (1)
2011年7月 (7)
2011年6月 (10)
2011年5月 (2)
相册
网狐棋牌源码分析
搜索
最新评论
1. re: Qt5 CMAKE编译简记
楼主楼主 这里有只菜鸟有问题
去哪里设置CMAKE_PREFIX_PATH到qtbase目录啊??
--amber
2. re: minidump吐出来的dump文件为空,文件大小为0[未登录]
@网友
duilib的Dump对象里边有一个临界区对象,有几个函数是被保护起来的。注释掉就好了。
--enic
3. re: minidump吐出来的dump文件为空,文件大小为0
去掉多线程保护是什么意思?怎么去掉?
--网友
4. re: cocos2dx-quick 01
评论内容较长,点击标题查看
--Enic
5. re: 星座物语客户端分析---01物品编辑器
评论内容较长,点击标题查看
--Enic
阅读排行榜
1. Qt5 CMAKE编译简记(22123)
2. centos编译安装git最新版本(12388)
3. 转 C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换 utf8转utf16 utf16转utf8(10912)
4. cmake 导入链接库(8344)
5. Duilib在MFC中使用(8223)
评论排行榜
1. gtest编译出错: 编译时,error C2977 "std::tuple" too many template arguments问题的解决办法(3)
2. C++多重继承时,用基类指针delete有坑(2)
3. C++ 11 新语法:只读遍历(2)
4. (转)C宏技巧汇总(2)
5. 撸UI库:01(2)
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版本错误也不会被漏掉,,,
关于事件的封装,在这里其实已经分层了,,,
这里是第一层:
1
struct
tagDataHead
2
{
3
WORD wDataSize;
//
数据大小
4
WORD wIdentifier;
//
类型标识
5
DWORD dwInsertTime;
//
插入时间
6
}
;
这一层实际上是由CDataStorage负责打包管理,在CQueueServiceEvent执行PostTimerEvent操作的时候会在内部调用CQueueService的add最终调用到CDataStrorage的Add来打包数据,这里的结构也是非常像网络数据包|- len -|- type -|- data -|。
在来看Post这一层做的数据打包:
1
//
定时器事件
2
struct
NTY_TimerEvent
3
{
4
WORD wTimerID;
//
定时器 ID
5
WPARAM wBindParam;
//
绑定参数
6
}
;
|- len -|- type -|- sub protocl -|。
其他事件的打包过程都是类似的:
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
}
;
还是一样,一句话总结CQueueServiceEvent:
线程安全的接受各种异步事件,并打包封装好以后插入到关联的制定IQueueService中.
posted on 2011-06-02 14:36
Enic
阅读(1638)
评论(0)
编辑
收藏
引用
所属分类:
网狐棋牌源码分析
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
协议分析-服务器接收
协议分析:GamePlaza的网络协议(收)
工具类:收发包辅助类 CSendPacketHelpr CRecvPacketHelpr
成也萧何败也肖何? IUnknowEx
服务引擎概览
异步引擎
CEventService
DataBaseEngine
TCPSocketEnging分析
TimerEngine
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © Enic