首页 > 代码库 > 服务器线程(不断跟新)

服务器线程(不断跟新)

m_spNPC = NEWSP(NPC);//NPC加载,如怪物等
m_spNPC->setFT(m_spTimerFactory.get());//共享Map中的定时器,让Map线程来驱动。
m_spNPC->setMapPtr_NPC(this);//一定要先调用地图

看到这个代码让我蛋疼一把,搜了一下m_spTimerFactory也没有看到相应的注册函数,于是看了下setFT:

void NPC::setFT(I_TimerFactory* pFT)
{
    m_pFT = pFT;    
    //[L]模拟怪物移动
    m_NpcAITimer.reset(/*GetPlug(TimerFactory)*/m_pFT->createTimer());//Timer::createTimer();
    m_NpcAITimer->setInterval(1000);//
    m_NpcAITimer->regTimer(std::bind(&NPC::NpcAITimer, this));
    m_NpcAITimer->start();
}

原来是NPC中定义了一个std::shared_ptr<I_Timer> m_NpcAITimer;然后m_spTimerFactory通过调用createTimer()就创建了一个定时器给他然后注册定时器函数,那这个定时器在哪儿驱动的呢?

void thrTransData::thread()
{
    MapPkt pkt;
    int num = 0;
    while (true)
    {
        if(get_data_from_queue(&pkt))
        {
            process_pkt(pkt);
            num++;
            if(num > 30)
            {
                num = 0;
                m_spTimerFactory->driveTimer();
            }
            continue;
        }
        {
            m_spTimerFactory->driveTimer();
            boost::this_thread::interruptible_wait(1);
        }
    }
}

不知这个线程时Map线程还是thrTranData线程,反正是在这里驱动的,所以才有上面的

//共享Map中的定时器,让Map线程来驱动。