Ko bu şekilde mi kullanıyor ?
std::vector<Thread *> g_timerThreads;
g_timerThreads.push_back(new Thread(Timer_CheckGameEvents));
Thread sınıfından nesne oluşturup vectore atıyor
uint32 CGameServerDlg::Timer_CheckGameEvents(void * lpParam)
{
while (g_bRunning)
{
g_pMain->BattleZoneOpenTimer(); // Check if it's time for the BattleZone to open or end.
g_pMain->TempleEventTimer();
g_pMain->ForgettenTempleEventTimer();
sleep(1 * SECOND);
}
return 0;
}1 saniyede bir timerları kontrol ediyor
örnek bir timer
void CGameServerDlg::TempleEventTimer()
{
uint32 nHour = g_localTime.tm_hour;
uint32 nMinute = g_localTime.tm_min;
if (m_nTempleEventRemainSeconds > 0)
m_nTempleEventRemainSeconds--;
if (pTempleEvent.ActiveEvent == -1)
{
for (int i = 0; i < CHAOS_EVENT_COUNT; i++)
{
if (nHour == m_nChaosTime[i] && nMinute == 0)
{
pTempleEvent.ActiveEvent = TEMPLE_EVENT_CHAOS;
pTempleEvent.ZoneID = ZONE_CHAOS_DUNGEON;
m_nTempleEventRemainSeconds = 600; // 10 minutes
TempleEventStart();
break;
}
}
#if 0 // Temporarily disabled
for (int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
{
if (nHour == m_nBorderDefenseWarTime[i] && nMinute == 32)
{
pTempleEvent.ActiveEvent = TEMPLE_EVENT_BORDER_DEFENCE_WAR;
pTempleEvent.ZoneID = ZONE_BORDER_DEFENSE_WAR;
m_nTempleEventRemainSeconds = 600; // 10 minutes
TempleEventStart();
break;
}
}
#endif
}
else if (pTempleEvent.ActiveEvent != -1)
{
if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_CHAOS)
{
for(int i = 0; i < CHAOS_EVENT_COUNT; i++)
{
if (nHour == m_nChaosTime[i]
&& nMinute == 11
&& !pTempleEvent.isActive) {
m_nTempleEventRemainSeconds = 0;
pTempleEvent.LastEventRoom = 1;
pTempleEvent.isActive = true;
TempleEventStart(); // Set RemainSeconds to zero
TempleEventTeleportUsers();
TempleEventSummonChaosCubes();
break;
}
else if (nHour == m_nChaosTime[i]
&& nMinute == 12
&& !pTempleEvent.isAttackable) {
pTempleEvent.isAttackable = true;
break;
}
else if (nHour == m_nChaosTime[i]
&& nMinute == 32
&& pTempleEvent.isActive) {
TempleEventFinish();
break;
}
}
}
#if 0 // Temporarily disabled
else if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_BORDER_DEFENCE_WAR)
{
for(int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
{
if (nHour == m_nBorderDefenseWarTime[i]
&& nMinute == 42
&& !pTempleEvent.isActive)
{
m_nTempleEventRemainSeconds = 0;
pTempleEvent.LastEventRoom = 1;
pTempleEvent.isActive = true;
TempleEventStart(); // Set RemainSeconds to zero
TempleEventTeleportUsers();
break;
}
else if (nHour == (m_nBorderDefenseWarTime[i] + 1)
&& nMinute == 2
&& pTempleEvent.isActive)
{
TempleEventFinish();
break;
}
}
}
#endif
}
}m_nChaosTime,m_nBorderDefenseWarTime bu değişkenler gameserver başlangıcında .ini dosyasından çekiliyor,bugüne kadar programı kastırmadılar gecikme vs de olmadı