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线程来驱动。