PDA

Просмотр полной версии : [Вопрос] Таймер



execution
15.03.2018, 18:08
Если повторно удалить таймер для игрока, что-то может быть не так? Тоесть, если для игрока удалил таймер в одном месте и затем ещё раз удаляю вдругом.

Elrmrnt-Kritik
15.03.2018, 19:07
Если повторно удалить таймер для игрока, что-то может быть не так? Тоесть, если для игрока удалил таймер в одном месте и затем ещё раз удаляю вдругом.

Допустим, Ваш код выглядит примерно так:


new pTimer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer", 1000, true, "i", playerid);
return 1;
}
stock SomeFunc(playerid)//какая-то функция
{
KillTimer(pTimer[playerid]);
return 1;
}


Заходит первый игрок. ID таймера, например, 1, будет записан в pTimer[0] (так как playerid начинается с 0). Удаляете этот таймер. Запускаете еще какой-то таймер (необязательно связанный вообще как-то с игроками. Любой таймер). Его ID снова будет 1 (мог бы быть 2, если бы вы первый не удалили). Опять удаляете таймер игрока (а ведь его ранее уже удаляли), ID которого хранится в pTimer[0]. Но ведь этот ID таймера, хранящегося там, совпадает с ID таймера, который был создан последним и с игроком никак не связан. В итоге, Вы удаляете какой-то таймер, теряя работоспособность кода. Как вариант, после удаления таймера записывайте в pTimer[playerid] значение, равное -1. Тогда и проблем не будет с этим связанных:


new pTimer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer", 1000, true, "i", playerid);
return 1;
}
stock SomeFunc(playerid)//какая-то функция
{
KillTimer(pTimer[playerid]);
pTimer[playerid] = -1;
return 1;
}


А далее уже добавляйте проверку: если значение не равно -1, таймер удаляете. Можно, конечно, и без проверок, но лишний раз вызывать какие-то функции... Зачем?

ziggi
15.03.2018, 19:40
Допустим, Ваш код выглядит примерно так:


new pTimer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer", 1000, true, "i", playerid);
return 1;
}
stock SomeFunc(playerid)//какая-то функция
{
KillTimer(pTimer[playerid]);
return 1;
}


Заходит первый игрок. ID таймера, например, 1, будет записан в pTimer[0] (так как playerid начинается с 0). Удаляете этот таймер. Запускаете еще какой-то таймер (необязательно связанный вообще как-то с игроками. Любой таймер). Его ID снова будет 1 (мог бы быть 2, если бы вы первый не удалили). Опять удаляете таймер игрока (а ведь его ранее уже удаляли), ID которого хранится в pTimer[0]. Но ведь этот ID таймера, хранящегося там, совпадает с ID таймера, который был создан последним и с игроком никак не связан. В итоге, Вы удаляете какой-то таймер, теряя работоспособность кода. Как вариант, после удаления таймера записывайте в pTimer[playerid] значение, равное -1. Тогда и проблем не будет с этим связанных:


new pTimer[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer", 1000, true, "i", playerid);
return 1;
}
stock SomeFunc(playerid)//какая-то функция
{
KillTimer(pTimer[playerid]);
pTimer[playerid] = -1;
return 1;
}


А далее уже добавляйте проверку: если значение не равно -1, таймер удаляете. Можно, конечно, и без проверок, но лишний раз вызывать какие-то функции... Зачем?

Не правда, ID созданных таймеров не повторяются (до переполнения их счетчика). Об этом, кстати, написано на wiki (http://wiki.sa-mp.com/wiki/SetTimer).