Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 3 из 3

Тема: Таймер

  1. #1
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±

    Таймер

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

  2. #2
    Аватар для Elrmrnt-Kritik
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.11.2017
    Сообщений
    136
    Репутация:
    10 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Если повторно удалить таймер для игрока, что-то может быть не так? Тоесть, если для игрока удалил таймер в одном месте и затем ещё раз удаляю вдругом.
    Допустим, Ваш код выглядит примерно так:
    PHP код:
    new pTimer[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        
    pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer"1000true"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. Тогда и проблем не будет с этим связанных:
    PHP код:
    new pTimer[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        
    pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer"1000true"i"playerid);
        return 
    1;
    }
    stock SomeFunc(playerid)//какая-то функция
    {
        
    KillTimer(pTimer[playerid]);
        
    pTimer[playerid] = -1;
        return 
    1;

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

  3. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от Elrmrnt-Kritik Посмотреть сообщение
    Допустим, Ваш код выглядит примерно так:
    PHP код:
    new pTimer[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        
    pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer"1000true"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. Тогда и проблем не будет с этим связанных:
    PHP код:
    new pTimer[MAX_PLAYERS];
    public 
    OnPlayerConnect(playerid)
    {
        
    pTimer[playerid] = SetTimerEx("OnPlayerSecondTimer"1000true"i"playerid);
        return 
    1;
    }
    stock SomeFunc(playerid)//какая-то функция
    {
        
    KillTimer(pTimer[playerid]);
        
    pTimer[playerid] = -1;
        return 
    1;

    А далее уже добавляйте проверку: если значение не равно -1, таймер удаляете. Можно, конечно, и без проверок, но лишний раз вызывать какие-то функции... Зачем?
    Не правда, ID созданных таймеров не повторяются (до переполнения их счетчика). Об этом, кстати, написано на wiki.

  4. 2 пользователя(ей) сказали cпасибо:
    Elrmrnt-Kritik (15.03.2018) Nash_Brigers (16.03.2018)
 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •