Шаблон:NotesSetTimer — различия между версиями
Материал из Pro-Pawn Wiki
м (Исправлено примечание о падении сервера из-за пустого текстового параметра (спецификатор "s"), отображавшееся на странице SetTimer) |
|||
Строка 4: | Строка 4: | ||
}} | }} | ||
{{NoteSAMPCritical | {{NoteSAMPCritical | ||
− | |||
| {{NoteEmptyStringCrash|<code>funcname</code>}} | | {{NoteEmptyStringCrash|<code>funcname</code>}} | ||
+ | | {{#if:{{{1|}}}| Передача пустой строки в качестве аргумента целевой функции (спецификатор <code>s</code>) приводит к падению сервера.}} | ||
| {{#if:{{{1|}}}| Крайне не рекомендуется передавать через данную функцию массивы и строки (спецификаторы <code>a</code> и <code>s</code> соответственно): под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов приводит к исчерпанию свободного места в секции стека/кучи, что влечёт за собой множественные ошибки времени выполнения (сервер будет периодически прерывать выполнение скрипта из-за нехватки свободного места в стеке) - первопричину таких ошибок очень трудно определить, если не знать о данном баге. Данная проблема отсутствует в сторонних реализациях таймеров (см. выше, разд. "Описание").}} | | {{#if:{{{1|}}}| Крайне не рекомендуется передавать через данную функцию массивы и строки (спецификаторы <code>a</code> и <code>s</code> соответственно): под них резервируется память в секции стека/кучи скрипта, однако эта память не высвобождается при уничтожении таймера. Многократное создание таймеров с передачей строк или массивов приводит к исчерпанию свободного места в секции стека/кучи, что влечёт за собой множественные ошибки времени выполнения (сервер будет периодически прерывать выполнение скрипта из-за нехватки свободного места в стеке) - первопричину таких ошибок очень трудно определить, если не знать о данном баге. Данная проблема отсутствует в сторонних реализациях таймеров (см. выше, разд. "Описание").}} | ||
}} | }} |
Текущая версия на 06:41, 21 октября 2022
Баг SA-MP |
Передача пустой строки в параметре funcname приводит к падению сервера.
|
Баг SA-MP |
Отсчёт времени в таймерах неточен. Для большей точности доступны сторонние реализации таймеров (см. выше, разд. "Описание").
При уничтожении с помощью KillTimer() таймер лишь помечается как уничтоженный, выделенная под него память высвобождается только при выгрузке или перезагрузке скрипта. Чрезмерное создание таймеров (от нескольких сотен тысяч; зависит от хостинга) может привести к исчерпанию оперативной памяти и падению сервера при длительной работе без рестарта. Тем не менее, если у таймера однократное срабатывание (т.е. при создании параметр repeating был равен 0 ), после срабатывания он уничтожается с высвобождением памяти.Данная проблема отсутствует в сторонних реализациях таймеров (см. выше, разд. "Описание"). Таймер создаётся даже в том случае, если функция с указанным названием не существует или интервал срабатывания меньше 0. При каждом срабатывании таймера сервер заново пытается отыскать функцию, вместо того, чтобы найти её один раз и запомнить её ID при создании таймера. Содержимое массива funcname не изменяется во время работы функции, однако сам массив объявлен без атрибута const :
native SetTimer(funcname[], interval, repeating); const -корректный) заголовок функции должен выглядеть так:
native SetTimer(const funcname[], interval, repeating); const , компилятор считает, что функция записывает в него данные, и потому не позволяет передавать в функцию неизменяемые массивы, выдавая ошибку несоответствия типов.
static const function_names[] = { "MyFunction0", "MyFunction1" }; new r = random(2); SetTimer(function_names[r], 1000, 0); // error 035: argument type mismatch (argument 1) |