(有什么问题欢迎指教,企鹅: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),然后由调度引擎集中派发出去

网狐棋牌代码分析(三) 调度引擎初步分析相关推荐

  1. 网狐棋牌(八) 异步引擎 和 网狐棋牌(九) 服务引擎概览

    相关UML: 核心技术在于:在指定的线程中创建窗口,然后向窗口发送消息,在窗口消息处理中调用外部回调. ------------------------------------------------ ...

  2. 网狐棋牌(三) 调度引擎初步分析

    相关UML: CAttempterEngine实现了两个接口:IQueueServiceSink.IAttemperEngine; 通过前面的分析,偶们了解到,IQueueServiceSink这个接 ...

  3. 网狐棋牌代码分析(二) CQueueServiceEvent初步分析

    (有什么问题欢迎指教,企鹅:2172243813 更多资讯尽在www.ttkmwl.com) 代码分析: 首先CQueueServiceEvent这个名字很有诱惑,,,你感觉他是一个事件,其实不是.它 ...

  4. 关于网狐棋牌6603源码的整理、编译和搭建

    最近换工作,趁着有一段清闲时间,整理了一下网狐棋牌的源码,这份源码下载很久了,一直呆在硬盘.这次正好好好看看. 网狐的代码质量很高,流露出来的代码也比较完整,基本上都能编译通过.但是要真的搭建起来,还 ...

  5. 网狐棋牌(六) DataBaseEngine 和 网狐棋牌(七) CEventService

    相关UML: 使用数据库引擎必须持有数据库引擎内部队列,实现数据库回调接口(用来处理数据库操作请求),然后结果投递到调度引擎队列. 理解网络狐棋牌,最重要是理解两个概念: 1,队列服务 2,接口的传递 ...

  6. 网狐棋牌游戏平台服务器架构设计分析

    调用模型 模仿COM组件接口模式,利用面向对象思想多态性polymorphism,调用方保存着被调用方的基础接口指针(interface or sink钩子)(Pure Virtual Functio ...

  7. 网狐棋牌游戏平台服务器架构设计分析[转]

    网狐棋牌游戏平台服务器架构设计分析[转] http://blog.csdn.net/weiwangchao_/article/details/7047044 基本设计概念和处理流程 调用模型 模仿CO ...

  8. 网狐棋牌经典版管理后台操作手册

    网狐棋牌_经典版游戏 管理后台操作手册                                   管理平台概述: i.             使用说明: 本手册是提供给运营商阅读使用,帮助 ...

  9. 关于网狐棋牌的数据库

    前不久放出了我自己整理的网狐棋牌的源码,下载的网友反应都不错,只是不少同学都找我要数据库,最近一直没时间,今天趁放假的时间把数据库放出来,分享给大家. 关于网狐棋牌6603源码的整理.编译和搭建 数据 ...

最新文章

  1. 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
  2. 导购提成怎么算_only导购工资提成怎么算标准
  3. hbase命令行在create table时为啥有MIN_VERSIONS而没有MAX_VERSIONS
  4. unity 全息交互ui_UI向3D投影全息界面的连续发展
  5. 如何ASP.NET Core Razor中处理Ajax请求
  6. mysql 排序1.1.1_mysql中字符串1.1/1.2/1.2.2/1.2.5排序问题
  7. This may cause things to work incorrectly. Make sure to use the same version for both.
  8. CDOJ 1803 绿帽自动机 思维题
  9. linux性能分析工具集(图示)
  10. 转载在linux下执行java窗口被锁定问题
  11. 解决Matlab画图直接保存.eps格式而导致图不全的问题
  12. 在Linux平台使用Firefox 登陆EBS r12环境
  13. Java-NIO(一):简介
  14. VB6各类源码开源 - 开源研究系列文章
  15. PS安装失败解决方法
  16. 2003服务器开机无限重启,Windows2003 系统自动重启
  17. 任务分销系统云智推任务提交版拉新系统网站源码
  18. 【论文分享】小样本图片分类方法:AwGCN:Few-Shot Learning With Attention-Weighted Graph Convolutional Networks
  19. 多模态模型 CLIP4Clip 带你实现文本与视频互搜
  20. poi 宋体_(六)POI-操作Excel的poi的字体设置

热门文章

  1. 【产品人生】<业务流程业务逻辑>产品经理需要掌握的各种图
  2. Python x OpenCV+Numpy 函数参考列表
  3. 《马伯庸笑翻中国简史》
  4. 统计一个数中二进制数1的个数(新手篇10)
  5. vim 清空文本内容指令
  6. vuex-module-decorators装饰器的使用
  7. 按开机计算机屏幕数字是,电脑开机后屏幕全都是英文字母及数字跳动,什么处理?...
  8. PTA:7-102 喊山 (30分)---解析(bfs广度优先搜索,vector)
  9. java疯狂讲义第四版第五章答案_疯狂java讲义第五章笔记
  10. 安卓源码集合,视频播放器手机屏幕助手点融投资悬浮窗抽奖转盘