Активный
- Тема Автор
- #1
Таймеры позволяют выполнять код через определенные промежутки времени. Разберем продвинутые техники.
Система управления таймерами
Таймеры с параметрами
Каскадные таймеры
Таймеры с условиями
Таймеры с приоритетами
Важные моменты:
- Управляйте таймерами централизованно
- Останавливайте ненужные таймеры
- Используйте правильные интервалы
- Оптимизируйте количество таймеров
Правильное использование таймеров улучшает производительность!
Система управления таймерами
Код:
enum TimerInfo
{
Timer:handle,
Function[32],
Interval,
Repeating,
Active
}
new TimerData[100][TimerInfo];
new TotalTimers = 0;
CreateManagedTimer(function[], interval, repeating)
{
if(TotalTimers >= sizeof(TimerData))
{
return -1;
}
strcpy(TimerData[TotalTimers][Function], function, 32);
TimerData[TotalTimers][Interval] = interval;
TimerData[TotalTimers][Repeating] = repeating;
TimerData[TotalTimers][Active] = 1;
if(repeating)
{
TimerData[TotalTimers][handle] = SetTimer(function, interval, true);
}
else
{
TimerData[TotalTimers][handle] = SetTimer(function, interval, false);
}
TotalTimers++;
return TotalTimers - 1;
}
StopManagedTimer(timerid)
{
if(timerid >= TotalTimers)
{
return 0;
}
if(TimerData[timerid][Active])
{
KillTimer(TimerData[timerid][handle]);
TimerData[timerid][Active] = 0;
}
return 1;
}
Таймеры с параметрами
Код:
// Создание таймера с параметрами
SetTimerEx("DelayedAction", 5000, false, "is", playerid, "параметр");
forward DelayedAction(playerid, text[]);
public DelayedAction(playerid, text[])
{
if(IsPlayerConnected(playerid))
{
new string[128];
format(string, sizeof(string), "Выполнено: %s", text);
SendClientMessage(playerid, -1, string);
}
}
// Множественные параметры
SetTimerEx("ComplexAction", 3000, false, "iif", playerid, 100, 3.14);
forward ComplexAction(playerid, value, Float:floatValue);
public ComplexAction(playerid, value, Float:floatValue)
{
// обработка
}
Каскадные таймеры
Код:
new CountdownValue = 10;
forward Countdown();
public Countdown()
{
if(CountdownValue > 0)
{
new string[64];
format(string, sizeof(string), "Осталось: %d секунд", CountdownValue);
SendClientMessageToAll(-1, string);
CountdownValue--;
}
else
{
SendClientMessageToAll(-1, "Время вышло!");
KillTimer(countdownTimer);
CountdownValue = 10; // сброс
}
}
StartCountdown()
{
CountdownValue = 10;
countdownTimer = SetTimer("Countdown", 1000, true);
}
Таймеры с условиями
Код:
forward ConditionalTimer();
public ConditionalTimer()
{
new activePlayers = 0;
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i))
{
activePlayers++;
}
}
// Выполнение только при наличии игроков
if(activePlayers > 0)
{
// код
ProcessPlayers();
}
else
{
// Остановка таймера при отсутствии игроков
KillTimer(conditionalTimer);
}
}
Таймеры с приоритетами
Код:
enum TimerPriority
{
PRIORITY_LOW,
PRIORITY_NORMAL,
PRIORITY_HIGH,
PRIORITY_CRITICAL
}
new TimerPriority[MAX_TIMERS];
CreatePriorityTimer(function[], interval, repeating, priority)
{
new timerid = CreateManagedTimer(function, interval, repeating);
if(timerid != -1)
{
TimerPriority[timerid] = priority;
}
return timerid;
}
// Выполнение таймеров по приоритету
ProcessTimers()
{
// Сначала критические
for(new i = 0; i < TotalTimers; i++)
{
if(TimerData[i][Active] && TimerPriority[i] == PRIORITY_CRITICAL)
{
// выполнение
}
}
// Затем высокие и т.д.
}
Важные моменты:
- Управляйте таймерами централизованно
- Останавливайте ненужные таймеры
- Используйте правильные интервалы
- Оптимизируйте количество таймеров
Правильное использование таймеров улучшает производительность!