void GameServer::ProcessThread()
{
try
{//在ui线程里面搞个大try不是说try效率不好吗,难道只是为了出现错误发现在GS线程里面出现的吗
ProcessThreadTry();
}
catch (...)
{
DWORD dwErrno = GetLastError(); MessageBox(NULL, L"GameServer::process_thread异常", L"异常", MB_OK);
}
} void GameServer::ProcessThreadTry()
{
int nCount = ;
packet Pkt;
Pkt.data = new char[ * ];
I_TimerFactory* pTimeFactory = GetPlug(TimerFactory);//定时保存还是在这个GS线程里面处理的 for (;;)
{
ProcMapSendData();//这个相当重要了,处理map发送给GS的数据 m_spAsynDBC->Drive();//驱动数据库回调
m_DBSaveTiming.DriveDBSaveTiming();//驱动定时保存道具,帮会
bool bRcvDataRet = ProcessLoop(Pkt);//收取网络数据并处理
ProcMapSendData();//又在这里处理网络数据,不知这个什么意思,故意这么安排的? if(bRcvDataRet)//缓存里面没有新命令,可以wait一下了
{
pTimeFactory->driveTimer();
//等1ms
//std::this_thread::sleep_for(std::chrono::milliseconds(1));
///对于这个曾经机器人总是在上线的时候人老是少,这个问题我找了好久不知什么原因,因为当时对于网络模块不熟,
///但下面这个GC里面没有发送的数据,到GS里面发送,没咋搞懂,GC和GS是在一个线程里面的,应该可以这样做,随后好好看看
/**
* [说明]:多进程模式,可能存在未分配成功共享内存而导致发送失败的时候,
* 需要GS这边帮未完成发送的GC发送数据,不然可能存在数据丢失的现象,
* 注意死循环
*/
////既然空闲了,就看看有没有没发出去的数据
if(m_queGcWait.empty())
{
boost::this_thread::interruptible_wait(); //stl的误差太大,用这个精度高//test2
continue;
}
int nMaxCount = ; //最多执行5个GC发送
do //注意别存在死循环
{
int nChannelId = m_queGcWait.front();
m_queGcWait.pop();
GameChannel* pGC = m_vecChannel[nChannelId];
if(m_LiveMgr.IsLive(nChannelId) && pGC) //如果改GC在线且活着,则发送未发送成功的数据。
pGC->SendCmdTry();
}while(m_queGcWait.size() && --nMaxCount);
}
nCount++;
if(nCount > )
{
pTimeFactory->driveTimer();
nCount = ; }
}
} bool GameServer::ProcessLoop(packet& rPkt)
{
if(false == m_spDataLayer->Recv(rPkt))
return true;//没数据了 if(rPkt.is_data)///网络是不是数据,有的是libevent事件
{
if(!rPkt.data)
return false; GameChannel* pGC = m_vecChannel[rPkt.channel_id];
if(pGC)
pGC->OnReceiveData(rPkt.data, rPkt.size); m_LiveMgr.OnLive(rPkt.channel_id);
}
else
{
//网络事件
link_stat stat = (link_stat)rPkt.size;
if (stat == link_stat::link_connected)
{
GameChannel* pNewGC = new GameChannel();
m_vecChannel[rPkt.channel_id] = pNewGC;//有玩家连接
pNewGC->m_nChannelId = rPkt.channel_id;
pNewGC->m_pDataLayer = m_spDataLayer.get();
pNewGC->m_pShare = this;
pNewGC->m_pAsynDBC = this->m_spAsynDBC.get();
//gc->m_db = this->m_asyndb->getSynDBptr();//把地址复制一份给GameChannel::m_db,让其具有数据库操作权
m_LiveMgr.Add(rPkt.channel_id);
}
else if (stat == link_stat::link_disconnected || stat == link_stat::link_connect_failed )
{
GameChannel* pDisconnectGC = m_vecChannel[rPkt.channel_id];
if(pDisconnectGC)
{
//如果进入了地图,保存人物信息时会调用push_freeQueue + 滞空m_Channels[channel_id],
pDisconnectGC->OnDisconnect(); //如果未进地图就下线,直接断开;不用保存角色详细数据,可直接放入释放队列中
if(!pDisconnectGC->m_pMap)
{
//PushFreeQueue(pDisconnectGC);
//m_vecChannel[rPkt.channel_id] = NULL;
AutoFreeGC(pDisconnectGC);
}
}
m_LiveMgr.Remove(rPkt.channel_id);
}
}
return false;
}
这个就是简单的介绍,GS这个模块很重要
GS
数据库 GameMap 网络 跨地图操作(道具,帮会,关系),这些都和GS有联系

GS线程的更多相关文章

  1. 再看GS线程

    再看GS线程 void GameServer::ProcessThreadTry() { ; packet rcvPkt; rcvPkt.data = * ]; //该事件工厂主要创建了两个定时器1. ...

  2. GS界面上显示的重要参考数据

    GS界面上显示的重要参考数据,这个是压测时重要参考 struct GSinfo { int revBuffNum; int sendBuffNum; int clientNum; int dbAskN ...

  3. 客户端发包 GS端接收

    客户端发包,GS接收 bool GameServer::ProcessLoop(packet& rPkt)//GS线程做的 { if(false == m_spDataLayer->Re ...

  4. GS初始化

    开启GameServer模式 init函数,现在看看这个大函数干什么的 //这个init也是GameServerUI里面调的,这个线程其实就做了一些初始化的工作,其实这里面没有什么主不主线程,都是在一 ...

  5. map线程

    来看看map线程到底是如何运行的 很早就知道一个map是一个线程,以后有可能改成一个map一个进程,那就先来看看一个map一个线程是如何运作的 其实刚开始整个服务器就是两个线程,但发现这样服务器支持的 ...

  6. GS(道具,帮会)定时存储

    //最近数据库存储做了重大改变,数据库内部的回头再说,先看看GS这边的 .现在感觉数据库的状态将请求包放入命令队列中,以前是全部放进去,这样让其他的数据库操作不会随着数据库定时器而变慢,GS线程去驱动 ...

  7. share干什么的

    share到底干什么的 //--------------------打开GameServer,share中加载------------------------- .加载nBodyID //玩家的nBo ...

  8. 项目分析(map复习)

    有段时间没看map里面的东西了,刚才看发现功能上增加了一些,在来复习了一次流程初始化每个map建立线程,这个线程有两个功能,1.处理GS发过来的包 2.驱动map里面的定时器GS发过来的包是存在m_g ...

  9. asynDBcenter(复习)

    asynDBCenter asynDBCenter是GS和DBCenter之间的模块,有了他GS访问数据库就是异步的了,以前是同步的,加入某个操作很耗时那么GS就在那等待这个返回值. .对于std:: ...

随机推荐

  1. a标签至于flash之上的时候,IE浏览器无法点击连接的问题

    <a style="display: block;height: 131px;position: absolute;z-index: 999;width: 222px;backgrou ...

  2. 【转】利用DCC32实现命令行批量编译

    *.dof [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 ...

  3. C++基本数据类型解惑

    记得刚学C语言的时候,对那些double,float,long,unsigned int各种混乱,基本是随便用,对数据类型没有一个整体的框架.最近学习<<C++ primer plus&g ...

  4. STM32F4_RCC系统时钟配置及描述

    Ⅰ.概述 对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳. 对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的 ...

  5. C 构造一个 简单配置文件读取库

    前言 最近看到这篇文章, json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool 感觉技术 ...

  6. kettle插入/更新

    1.数据库环境 --------------------实时表 ),Info )); ,'张启山','长沙'); ,'尹新月','长沙'); ,'二月红','长沙'); --------------- ...

  7. Swift学习初步(一)

    前几天刚刚将有关oc的教程草草的看了一遍,发现oc其实也不像传说的那么难.今天又开始马不停蹄的学习Swift因为我很好奇,到底苹果出的而且想要代替oc的编程语言应该是个什么样子呢?看了网上的一些中文教 ...

  8. 苹果HomeKit如何牵动全国智能硬件格局

    苹果HomeKit如何牵动全国智能硬件格局 2014-06-23 15:48 发表      系统分类:消费电子      自定义分类:默认 标签:智能家居 苹果在6月的WWDC开发者大会上发布了包括 ...

  9. python数组的使用

    python数组的使用 2010-07-28 17:17 1.Python的数组分三种类型:(1) list 普通的链表,初始化后可以通过特定方法动态增加元素.定义方式:arr = [元素] (2) ...

  10. win10里安装.net3.5

    在CMD窗口里面输入这样一段,来安装Microsoft.MET Framework 3.5 Dism /online /enable-feature /featurename:NetFX3 /All ...