网狐棋牌代码分析(三) 调度引擎初步分析
(有什么问题欢迎指教,企鹅:2172243813 更多资讯尽在www.ttkmwl.com)
virtual bool__cdecl StartService();
//停止服务
virtual bool__cdecl StopService();
//设置网络
virtual bool__cdecl SetSocketEngine(IUnknownEx * pIUnknownEx);
//注册钩子
virtual bool__cdecl SetAttemperEngineSink(IUnknownEx * pIUnknownEx);
//获取接口
virtual void* __cdecl GetQueueService(const IID & Guid, DWORDdwQueryVer);
CAttempterEngine实现了两个接口:IQueueServiceSink、IAttemperEngine;
通过前面的分析,偶们了解到,IQueueServiceSink这个接口被是用来处理CQueueService中的数据的,根据上面的UML我们可以看到,CAttemperEngine关联了一个CQueueService(或者直接点说是:持有了一个CQueueService对象,说组合也成)。这样的话这个CAttemperEngine暴露出来的接口就只剩下IAttemperEnging了。
这个接口有两处值得单独讨论的:SetSocketEngine、GetQueueService;
SetSocketEngine,后面的分析中还会出现,我觉得这里是一个设计上的失误导致需要暴露socket引擎接口;
GetQueueService的设计思路可能是说,每个IAttemperEngine接口背后都有一个CQueueService,从以后的分析中可以看到,这个思路是理解整个kernel的关键。调度引擎应该是一个消息汇总(从个个引擎产生的消息)然后派发到IAttemperEngineSink。因为代码中是没有看到有关ITimerSink ISocketSink之类的东东的,,,
整个消息是个引擎产生,然后投递到指定的CQueueService,然后汇总到这里被派发到IAttemperEngineSink出去的,,,
看看CAttemperEngine中处理数据的代码:
1//队列接口
2void __cdecl CAttemperEngine::OnQueueServiceSink(WORD wIdentifier,void * pBuffer, WORD wDataSize, DWORD dwInsertTime)
3 {
4 //内核事件
5 ASSERT(m_pIAttemperEngineSink!=NULL);
6 switch(wIdentifier)
7 {
8 caseEVENT_TIMER: //定时器事件
9 {
10 //效验参数
11 ASSERT(wDataSize==sizeof(NTY_TimerEvent));
12 if (wDataSize!=sizeof(NTY_TimerEvent)) return;
13
14 //处理消息
15 NTY_TimerEvent * pTimerEvent=(NTY_TimerEvent *)pBuffer;
16 m_pIAttemperEngineSink->OnEventTimer(pTimerEvent->wTimerID,pTimerEvent->wBindParam);
17
18 return;
19 }
20 caseEVENT_DATABASE: //数据库事件
21 {
22 //效验参数
23 ASSERT(wDataSize>=sizeof(NTY_DataBaseEvent));
24 if (wDataSize
25
26 //处理消息
27 NTY_DataBaseEvent * pDataBaseEvent=(NTY_DataBaseEvent*)pBuffer;
28 m_pIAttemperEngineSink->OnEventDataBase(pDataBaseEvent+1,wDataSize-sizeof(NTY_DataBaseEvent),pDataBaseEvent);
29
30 return;
31 }
32 caseEVENT_SOCKET_ACCEPT: //网络应答事件
33 {
34 //效验大小
35 ASSERT(wDataSize==sizeof(NTY_SocketAcceptEvent));
36 if (wDataSize!=sizeof(NTY_SocketAcceptEvent)) return;
37
38 //处理消息
39 NTY_SocketAcceptEvent * pSocketAcceptEvent=(NTY_SocketAcceptEvent*)pBuffer;
40 m_pIAttemperEngineSink->OnEventSocketAccept(pSocketAcceptEvent);
41
42 return;
43 }
44 caseEVENT_SOCKET_READ: //网络读取事件
45 {
46 //效验大小
47 NTY_SocketReadEvent * pSocketReadEvent=(NTY_SocketReadEvent*)pBuffer;
48 ASSERT(wDataSize>=sizeof(NTY_SocketReadEvent));
49 ASSERT(wDataSize==(sizeof(NTY_SocketReadEvent)+pSocketReadEvent->wDataSize));
50 if (wDataSize
51 if(wDataSize!=(sizeof(NTY_SocketReadEvent)+pSocketReadEvent->wDataSize))return;
52
53 //处理消息
54 bool bSuccess=false;
55 try
56 {
57 bSuccess=m_pIAttemperEngineSink->OnEventSocketRead(pSocketReadEvent->Command,pSocketReadEvent+1,pSocketReadEvent->wDataSize,pSocketReadEvent);
58 }
59 catch () {}
60 if (bSuccess==false)m_pITCPSocketEngine->CloseSocket(pSocketReadEvent->wIndex,pSocketReadEvent->wRoundID);
61
62 return;
63 }
64 caseEVENT_SOCKET_CLOSE: //网络关闭事件
65 {
66 //效验大小
67 ASSERT(wDataSize==sizeof(NTY_SocketCloseEvent));
68 if (wDataSize!=sizeof(NTY_SocketCloseEvent)) return
69
70 //处理消息
71 NTY_SocketCloseEvent * pSocketCloseEvent=(NTY_SocketCloseEvent*)pBuffer;
72 m_pIAttemperEngineSink->OnEventSocketClose(pSocketCloseEvent);
73
74 return;
75 }
76 }
77
78 //其他事件
79 m_pIAttemperEngineSink->OnAttemperEvent(wIdentifier,pBuffer,wDataSize,dwInsertTime);
80
81 return;
82}
这个函数中一个很重要的参数:wIdentifier;
可以来追溯一下他的源头:
1//数据消息
2void CQueueService::OnQueueServiceThread(const tagDataHead &DataHead, void * pBuffer, WORD wDataSize)
3{
4 ASSERT(m_pIQueueServiceSink!=NULL);
5 try
6 {
7 m_pIQueueServiceSink->OnQueueServiceSink(DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime);
8 }
9 catch (...){}
10 return;
11}
可以看见他是直接保存在最底层的那个DataStroage里边的,这个在上一章分析中可以看到。(个引擎利用CQueueServiceEvent Post数据的时候就携带了类型信息)
另外一个要注意的点是对socket事件的处理,我之前认为调度引擎组合了一个socket引擎是一个设计缺陷,应为这里的在处理socketread事件的时候如果异常了直接直接使用引擎来关闭socket而不是调用socketsink的指定接口。猜想也许是不希望客户端直接处理socket句柄吧,,,
还是用一句话描述下调度引擎:
调度引擎的工作可以这样描述消息汇总、派发。其他引擎通过CQueueServiceEvent将消息post到调度引擎上来(通过共享同一个CQueueService),然后由调度引擎集中派发出去
网狐棋牌代码分析(三) 调度引擎初步分析相关推荐
- 网狐棋牌(八) 异步引擎 和 网狐棋牌(九) 服务引擎概览
相关UML: 核心技术在于:在指定的线程中创建窗口,然后向窗口发送消息,在窗口消息处理中调用外部回调. ------------------------------------------------ ...
- 网狐棋牌(三) 调度引擎初步分析
相关UML: CAttempterEngine实现了两个接口:IQueueServiceSink.IAttemperEngine; 通过前面的分析,偶们了解到,IQueueServiceSink这个接 ...
- 网狐棋牌代码分析(二) CQueueServiceEvent初步分析
(有什么问题欢迎指教,企鹅:2172243813 更多资讯尽在www.ttkmwl.com) 代码分析: 首先CQueueServiceEvent这个名字很有诱惑,,,你感觉他是一个事件,其实不是.它 ...
- 关于网狐棋牌6603源码的整理、编译和搭建
最近换工作,趁着有一段清闲时间,整理了一下网狐棋牌的源码,这份源码下载很久了,一直呆在硬盘.这次正好好好看看. 网狐的代码质量很高,流露出来的代码也比较完整,基本上都能编译通过.但是要真的搭建起来,还 ...
- 网狐棋牌(六) DataBaseEngine 和 网狐棋牌(七) CEventService
相关UML: 使用数据库引擎必须持有数据库引擎内部队列,实现数据库回调接口(用来处理数据库操作请求),然后结果投递到调度引擎队列. 理解网络狐棋牌,最重要是理解两个概念: 1,队列服务 2,接口的传递 ...
- 网狐棋牌游戏平台服务器架构设计分析
调用模型 模仿COM组件接口模式,利用面向对象思想多态性polymorphism,调用方保存着被调用方的基础接口指针(interface or sink钩子)(Pure Virtual Functio ...
- 网狐棋牌游戏平台服务器架构设计分析[转]
网狐棋牌游戏平台服务器架构设计分析[转] http://blog.csdn.net/weiwangchao_/article/details/7047044 基本设计概念和处理流程 调用模型 模仿CO ...
- 网狐棋牌经典版管理后台操作手册
网狐棋牌_经典版游戏 管理后台操作手册 管理平台概述: i. 使用说明: 本手册是提供给运营商阅读使用,帮助 ...
- 关于网狐棋牌的数据库
前不久放出了我自己整理的网狐棋牌的源码,下载的网友反应都不错,只是不少同学都找我要数据库,最近一直没时间,今天趁放假的时间把数据库放出来,分享给大家. 关于网狐棋牌6603源码的整理.编译和搭建 数据 ...
最新文章
- 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
- 导购提成怎么算_only导购工资提成怎么算标准
- hbase命令行在create table时为啥有MIN_VERSIONS而没有MAX_VERSIONS
- unity 全息交互ui_UI向3D投影全息界面的连续发展
- 如何ASP.NET Core Razor中处理Ajax请求
- mysql 排序1.1.1_mysql中字符串1.1/1.2/1.2.2/1.2.5排序问题
- This may cause things to work incorrectly. Make sure to use the same version for both.
- CDOJ 1803 绿帽自动机 思维题
- linux性能分析工具集(图示)
- 转载在linux下执行java窗口被锁定问题
- 解决Matlab画图直接保存.eps格式而导致图不全的问题
- 在Linux平台使用Firefox 登陆EBS r12环境
- Java-NIO(一):简介
- VB6各类源码开源 - 开源研究系列文章
- PS安装失败解决方法
- 2003服务器开机无限重启,Windows2003 系统自动重启
- 任务分销系统云智推任务提交版拉新系统网站源码
- 【论文分享】小样本图片分类方法:AwGCN:Few-Shot Learning With Attention-Weighted Graph Convolutional Networks
- 多模态模型 CLIP4Clip 带你实现文本与视频互搜
- poi 宋体_(六)POI-操作Excel的poi的字体设置
热门文章
- 【产品人生】<业务流程业务逻辑>产品经理需要掌握的各种图
- Python x OpenCV+Numpy 函数参考列表
- 《马伯庸笑翻中国简史》
- 统计一个数中二进制数1的个数(新手篇10)
- vim 清空文本内容指令
- vuex-module-decorators装饰器的使用
- 按开机计算机屏幕数字是,电脑开机后屏幕全都是英文字母及数字跳动,什么处理?...
- PTA:7-102 喊山 (30分)---解析(bfs广度优先搜索,vector)
- java疯狂讲义第四版第五章答案_疯狂java讲义第五章笔记
- 安卓源码集合,视频播放器手机屏幕助手点融投资悬浮窗抽奖转盘