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线程来驱动。
时间: 2024-10-17 15:30:04