adme adlı üyeden alıntı: mesajı görüntüle
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ı