SetTimerEx

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск

Описание:

Создаёт таймер для отложенного вызова функции.

Warning.png
Внимание!
Частое создание таймеров может привести к падению сервера (см. прим. ниже). Рекомендуется использовать одну из сторонних реализаций таймеров в плагинах TimerFix (за авторством KashCherry) или Timerfix (изначально за авторством udan11; на данный момент под сопровождением ziggi).


Параметры:

(funcname[], interval, repeating, const format[], {Float,_}:...)
funcname[] Название функции.
interval Интервал срабатывания таймера (в миллисекундах).
repeating Указывает, должен ли таймер срабатывать многократно. При 0 таймер срабатывает только один раз и самоуничтожается, при ненулевом значении - срабатывает многократно до тех пор, пока не будет уничтожен с помощью функции KillTimer().
const format[] Строка со спецификаторами для обозначения типов аргументов.
{Float,_}:... Аргументы, передаваемые целевой функции при срабатывании таймера.


Возвращаемое значение:

ID созданного таймера.

Info rhombus.png
Примечание
Вызываемая функция должна быть объявлена с атрибутом public либо её название должно начинаться с символа @.
Один и тот же ID не используется для создания таймера дважды; у каждого нового таймера ID на 1 больше предыдущего.


Bug.png
Баг SA-MP
Передача пустой строки в параметре funcname приводит к падению сервера.
Передача пустой строки в качестве аргумента целевой функции (спецификатор s) приводит к падению сервера.
Крайне не рекомендуется передавать через данную функцию массивы и строки (спецификаторы a и s соответственно): под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов приводит к исчерпанию свободного места в секции стека/кучи, что влечёт за собой множественные ошибки времени выполнения (сервер будет периодически прерывать выполнение скрипта из-за нехватки свободного места в стеке) - первопричину таких ошибок очень трудно определить, если не знать о данном баге. Данная проблема отсутствует в сторонних реализациях таймеров (см. выше, разд. "Описание").


Bug.png
Баг SA-MP
Отсчёт времени в таймерах неточен. Для большей точности доступны сторонние реализации таймеров (см. выше, разд. "Описание").
При уничтожении с помощью KillTimer() таймер лишь помечается как уничтоженный, выделенная под него память высвобождается только при выгрузке или перезагрузке скрипта. Чрезмерное создание таймеров (от нескольких сотен тысяч; зависит от хостинга) может привести к исчерпанию оперативной памяти и падению сервера при длительной работе без рестарта. Тем не менее, если у таймера однократное срабатывание (т.е. при создании параметр repeating был равен 0), после срабатывания он уничтожается с высвобождением памяти.
Данная проблема отсутствует в сторонних реализациях таймеров (см. выше, разд. "Описание").
Таймер создаётся даже в том случае, если функция с указанным названием не существует или интервал срабатывания меньше 0.
При каждом срабатывании таймера сервер заново пытается отыскать функцию, вместо того, чтобы найти её один раз и запомнить её ID при создании таймера.
Содержимое массива funcname не изменяется во время работы функции, однако сам массив объявлен без атрибута const:
native SetTimerEx(funcname[], interval, repeating, const format[], {Float,_}:...);
в то время, как правильный (const-корректный) заголовок функции должен выглядеть так:
native SetTimerEx(const funcname[], interval, repeating, const format[], {Float,_}:...);
Если аргумент-массив объявлен без const, компилятор считает, что функция записывает в него данные, и потому не позволяет передавать в функцию неизменяемые массивы, выдавая ошибку несоответствия типов.
static const function_names[] = { "MyFunction0", "MyFunction1" };
new r = random(2);
SetTimerEx(function_names[r], 1000, 0, ""); // error 035: argument type mismatch (argument 1)


Пример использования:

forward MyTimerFunction(a, b);
public  MyTimerFunction(a, b)
{
    printf("%d, %d", a, b);
}

main()
{
    SetTimerEx("MyTimerFunction", 1000, 0, "dd", 1, 2);
}


См. также: