Не убиваются таймеры -
Josipo - 29.01.2018
Долгое время использовал y_timers, но решил вернуть обычные таймеры.
В OnPlayerConnect:
PlayerInfo[playerid][pTimer] = SetTimerEx("PlayerTimer", 500, true, "i", playerid);
В OnPlayerDisconnect:
KillTimer(PlayerInfo[playerid][pTimer]);
При первом входе на сервер всё нормально. Но если перезайти, то таймеры начинаются выполняться в 2 раза быстрее. И так каждый раз в 2 раза быстрее.
Похоже на то, что таймер не убивается при выходе. А при входе создаётся еще один.
Почему так может быть?
Re: Не убиваются таймеры -
Mutha_X - 29.01.2018
Самостоятельно вызвать OnPlayerDisconnect для каждого игрока при вызове перезагрузки.
Либо, если OnPlayerDisconnect изначально не был предназначен у вас для такого случая, вызвать те процедуры из этого callback, которые приведут к убийству таймера, сохранению данных и ещё чего-либо нужного.
Re: Не убиваются таймеры -
Josipo - 29.01.2018
Quote:
Originally Posted by Mutha_X
Самостоятельно вызвать OnPlayerDisconnect для каждого игрока при вызове перезагрузки.
Либо, если OnPlayerDisconnect изначально не был предназначен у вас для такого случая, вызвать те процедуры из этого callback, которые приведут к убийству таймера, сохранению данных и ещё чего-либо нужного.
|
Не совсем понял чем мне это поможет. Проблема возникает не при перезагрузке. А при обычном релоге.
И судя по всему, таймер как раз и не убивается в OnPlayerDisconnect
Re: Не убиваются таймеры -
pawnoholic - 29.01.2018
Отдебаж PlayerInfo[playerid][pTimer] до и после вызова KillTimer
Таймер зациклен, можно киллнуть его внутри него, если игрок отключен.
Re: Не убиваются таймеры -
Jasno - 29.01.2018
Легче SetTimerEx("PlayerTimer", 500, false, "i", playerid);
public PlayerTimer(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
SetTimerEx("PlayerTimer", 500, false, "i", playerid);
return 1;
}
Или
public PlayerTimer(playerid)
{
if(!IsPlayerConnected(playerid)) return KillTimer(PlayerInfo[playerid][pTimer]);
return 1;
}
Re: Не убиваются таймеры -
Mexanizm93 - 29.01.2018
А что мешает создать один таймер, который будет просчитывать игроков, и не заморачиваться ?
В теле таймера гнать цикл и проверять игроков на коннект итд. Не придётся ничего создавать и убивать таймер.
Re: Не убиваются таймеры -
Josipo - 29.01.2018
Quote:
Originally Posted by Mexanizm93
А что мешает создать один таймер, который будет просчитывать игроков, и не заморачиваться ?
В теле таймера гнать цикл и проверять игроков на коннект итд. Не придётся ничего создавать и убивать таймер.
|
Ничего. Но слышал мнение, что это хуже с точки зрения производительности.
Re: Не убиваются таймеры -
OKStyle - 29.01.2018
Quote:
Originally Posted by Jasno
Легче SetTimerEx("PlayerTimer", 500, false, "i", playerid);
public PlayerTimer(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
SetTimerEx("PlayerTimer", 500, false, "i", playerid);
return 1;
}
|
Нормальная тема.
Re: Не убиваются таймеры -
Josipo - 29.01.2018
Quote:
Originally Posted by OKStyle
Нормальная тема.
|
Этот вариант отлично работает. Спасибо тому, кто предложил.
Но всё же очень странно почему таймер не убивается.
Это даже в логах видно.
[19:06:23] PlayerTimer 0
[19:06:23] PlayerTimer 0
[19:06:24] PlayerTimer 0
[19:06:24] PlayerTimer 0
[19:06:24] PlayerTimer 0
[19:06:24] [part] Manuel_Moralez has left the server (0:1)
[19:06:24] PlayerTimer 0
[19:06:25] PlayerTimer 0
[19:06:25] PlayerTimer 0
[19:06:25] PlayerTimer 0
[19:06:25] PlayerTimer 0
[19:06:26] PlayerTimer 0
Re: Не убиваются таймеры -
DartfoL - 29.01.2018
возможно, где-то выше в OnPlayerDisconnect происходит runtime ошибка и выполнение паблика прерывается, поэтому таймер и не убивается. crashdetect стоит?
Re: Не убиваются таймеры -
stabker - 29.01.2018
Quote:
Originally Posted by OKStyle
Нормальная тема.
|
Не очень. У меня из-за этого создавалось два односекундных таймера. Когда один игрок выходит, а другой успевает зайти под его слот.
Если решать костылями, то лучше добавить проверку на подключенность игрока в повторяющемся таймере, а сам таймер удалять не только при отключении, но и при подключении.
А в идеале решить это:
Quote:
Originally Posted by DartfoL
возможно, где-то выше в OnPlayerDisconnect происходит runtime ошибка и выполнение паблика прерывается, поэтому таймер и не убивается. crashdetect стоит?
|
Re: Не убиваются таймеры -
Josipo - 29.01.2018
Quote:
Originally Posted by DartfoL
возможно, где-то выше в OnPlayerDisconnect происходит runtime ошибка и выполнение паблика прерывается, поэтому таймер и не убивается. crashdetect стоит?
|
Стоит. И выше там ничего нет.
Re: Не убиваются таймеры -
Jasno - 30.01.2018
Quote:
Originally Posted by stabker
Не очень. У меня из-за этого создавалось два односекундных таймера. Когда один игрок выходит, а другой успевает зайти под его слот.
Если решать костылями, то лучше добавить проверку на подключенность игрока в повторяющемся таймере, а сам таймер удалять не только при отключении, но и при подключении.
А в идеале решить это:
|
Можно использовать 2 вариант, да и такая проблема как создание 2 решается очень легко. Да и возникнуть она может только если сразу в OnPlayerConnect пихать, обычно апдейт пихают после авторизации/регистрации.
А вообще советую создать 1 таймер для всех игроков
public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
Re: Не убиваются таймеры -
White_116 - 30.01.2018
Quote:
Originally Posted by Josipo
Похоже на то, что таймер не убивается при выходе. А при входе создаётся еще один.
Почему так может быть?
|
Автор, не канифоль мозги, прологируй вызов убийства таймера. И введи доп. проверки при коннекте, удален ли таймер. Поносаветовали тут хурмы всякой, сразу чувствуется клуб теоретиков.
Re: Не убиваются таймеры -
Eims - 30.01.2018
Quote:
Originally Posted by Jasno
А вообще советую создать 1 таймер для всех игроков
public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
|
Это вообще что за ужас?
Один совет лучше другого
Re: Не убиваются таймеры -
OstGot - 30.01.2018
Quote:
Originally Posted by Jasno
А вообще советую создать 1 таймер для всех игроков
public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
|
Если юзать глобальный таймер без foreach, то ни разу не лучше индивидуальных, а даже наоборот.
Re: Не убиваются таймеры -
Mcc - 30.01.2018
Вайт красава разложил по полочкам