SA-MP Forums Archive
Не убиваются таймеры - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: Не убиваются таймеры (/showthread.php?tid=648824)



Не убиваются таймеры - 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
View Post
Самостоятельно вызвать 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
View Post
А что мешает создать один таймер, который будет просчитывать игроков, и не заморачиваться ?
В теле таймера гнать цикл и проверять игроков на коннект итд. Не придётся ничего создавать и убивать таймер.
Ничего. Но слышал мнение, что это хуже с точки зрения производительности.


Re: Не убиваются таймеры - OKStyle - 29.01.2018

Quote:
Originally Posted by Jasno
View Post
Легче 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
View Post
Нормальная тема.
Этот вариант отлично работает. Спасибо тому, кто предложил.

Но всё же очень странно почему таймер не убивается.

Это даже в логах видно.

[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

Вайт красава разложил по полочкам