SA-MP Forums

Go Back   SA-MP Forums > Non-English > Languages > Русский/Russian

Reply
 
Thread Tools Display Modes
Old 29/01/2018, 03:56 PM   #11
stabker
High-roller
 
stabker's Avatar
 
Join Date: Mar 2012
Location: Andromeda Galaxy
Posts: 1,321
Reputation: 86
Default Re: Не убиваются таймеры

Quote:
Originally Posted by OKStyle View Post
Нормальная тема.
Не очень. У меня из-за этого создавалось два односекундных таймера. Когда один игрок выходит, а другой успевает зайти под его слот.

Если решать костылями, то лучше добавить проверку на подключенность игрока в повторяющемся таймере, а сам таймер удалять не только при отключении, но и при подключении.

А в идеале решить это:

Quote:
Originally Posted by DartfoL View Post
возможно, где-то выше в OnPlayerDisconnect происходит runtime ошибка и выполнение паблика прерывается, поэтому таймер и не убивается. crashdetect стоит?
stabker is offline   Reply With Quote
Old 29/01/2018, 04:31 PM   #12
Josipo
Big Clucker
 
Join Date: Dec 2010
Posts: 97
Reputation: 0
Default Re: Не убиваются таймеры

Quote:
Originally Posted by DartfoL View Post
возможно, где-то выше в OnPlayerDisconnect происходит runtime ошибка и выполнение паблика прерывается, поэтому таймер и не убивается. crashdetect стоит?
Стоит. И выше там ничего нет.
Josipo is offline   Reply With Quote
Old 30/01/2018, 01:45 AM   #13
Jasno
Little Clucker
 
Join Date: Nov 2017
Posts: 15
Reputation: 0
Default Re: Не убиваются таймеры

Quote:
Originally Posted by stabker View Post
Не очень. У меня из-за этого создавалось два односекундных таймера. Когда один игрок выходит, а другой успевает зайти под его слот.

Если решать костылями, то лучше добавить проверку на подключенность игрока в повторяющемся таймере, а сам таймер удалять не только при отключении, но и при подключении.

А в идеале решить это:
Можно использовать 2 вариант, да и такая проблема как создание 2 решается очень легко. Да и возникнуть она может только если сразу в OnPlayerConnect пихать, обычно апдейт пихают после авторизации/регистрации.
А вообще советую создать 1 таймер для всех игроков

public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
Jasno is offline   Reply With Quote
Old 30/01/2018, 05:43 AM   #14
White_116
High-roller
 
Join Date: Sep 2010
Location: Russia/116
Posts: 1,479
Reputation: 69
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Josipo View Post
Похоже на то, что таймер не убивается при выходе. А при входе создаётся еще один.

Почему так может быть?
Автор, не канифоль мозги, прологируй вызов убийства таймера. И введи доп. проверки при коннекте, удален ли таймер. Поносаветовали тут хурмы всякой, сразу чувствуется клуб теоретиков.
__________________
White_116 is offline   Reply With Quote
Old 30/01/2018, 08:26 AM   #15
Eims
Huge Clucker
 
Eims's Avatar
 
Join Date: May 2013
Location: Восточный Мордор
Posts: 417
Reputation: 12
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Jasno View Post
А вообще советую создать 1 таймер для всех игроков

public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
Это вообще что за ужас?
Один совет лучше другого
__________________
- How many IT Engineers does it take to fix a broken light bulb?
- None, the light bulb works fine in my office, I cannot replicate the issue.
Eims is offline   Reply With Quote
Old 30/01/2018, 11:19 AM   #16
OstGot
Gangsta
 
OstGot's Avatar
 
Join Date: Mar 2013
Location: Gomel, Belarus
Posts: 692
Reputation: 293
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Jasno View Post
А вообще советую создать 1 таймер для всех игроков

public TimerAllPlayer()
{
for(new pid = -1; pid<GetPlayerPoolSize();pid++)
{
if(!IsPlayerConnected(pid)) continue;
//Код
}
return 1;
}
Если юзать глобальный таймер без foreach, то ни разу не лучше индивидуальных, а даже наоборот.
__________________
aka Nexius
Don't want to always check for updates of my scripts?
Include it the last, after all others
Nexius's Update Checker
OstGot is offline   Reply With Quote
Old 30/01/2018, 12:35 PM   #17
Mexanizm93
Big Clucker
 
Mexanizm93's Avatar
 
Join Date: Jan 2013
Location: Russia. Voronezh
Posts: 167
Reputation: 6
Default Re: Не убиваются таймеры

Quote:
Originally Posted by OstGot View Post
Если юзать глобальный таймер без foreach, то ни разу не лучше индивидуальных, а даже наоборот.
Чем же хуже, когда один глобальный таймер обрабатывает игроков циклом ? А создавать на каждого игрока таймер и выполнять тот же самый код не хуже, если можно обойтись одним зацикленным ? На мой взгляд, единый таймер на игроков лучше.

Quote:
Originally Posted by Eims View Post
Это вообще что за ужас?
Один совет лучше другого
Предложи вариант лучше.
__________________
We do not drink vodka every day and do not play the balalaika you think about us. ^_^ © Mexanizm

Last edited by Mexanizm93; 30/01/2018 at 01:51 PM.
Mexanizm93 is offline   Reply With Quote
Old 30/01/2018, 06:20 PM   #18
White_116
High-roller
 
Join Date: Sep 2010
Location: Russia/116
Posts: 1,479
Reputation: 69
Default Re: Не убиваются таймеры

Quote:
Originally Posted by Mexanizm93 View Post
Чем же хуже, когда один глобальный таймер обрабатывает игроков циклом ? А создавать на каждого игрока таймер и выполнять тот же самый код не хуже, если можно обойтись одним зацикленным ? На мой взгляд, единый таймер на игроков лучше.
Если скорость выполнения функции высокая, иначе создаёшь один большой микролаг. Индивидуальные таймеры же работают сами по себе, т.е. происходит рассеивание выполнение кода в промежутке времени, но пока выполняется поток амх машины.

Набросал проверочный код, выздоравливайте.
PHP Code:
new TestTimer[MAX_PLAYERS+1] = {-1, ...};
public 
OnPlayerConnect(playerid)
{
    if(
TestTimer[playerid] != -1)
    {
        print(
"WTF? I KILL YOU MR. F*CKING TIMER!");
        
KillTimer(TestTimer[playerid]);
        
TestTimer[playerid] = -1;
    }
        
    
TestTimer[playerid] = SetTimerEx("PlayerTestTimer"500true"i"playerid);
    return 
true;
}

public 
OnPlayerDisconnect(playeridreason)
{
    if(
TestTimer[playerid] != -1)
    {
        print(
"WTF? F*CKING TIMERS!");
    }
    else
    {
        
KillTimer(TestTimer[playerid]);
        
TestTimer[playerid] = -1;
    }
    return 
true;
}

forward PlayerTestTimer(playerid);
public 
PlayerTestTimer(playerid)
{
    static new 
OldTickCount 0;
    
printf("PlayerTestTimer(%d) TimeElapsed: %d"playerid, (GetTickCount() - OldTickCount));
    
OldTickCount GetTickCount();
    return 
1;

__________________
White_116 is offline   Reply With Quote
Old 30/01/2018, 07:43 PM   #19
Mcc
Huge Clucker
 
Join Date: May 2015
Posts: 457
Reputation: 19
Default Re: Не убиваются таймеры

Вайт красава разложил по полочкам
Mcc is offline   Reply With Quote
Old 30/01/2018, 07:57 PM   #20
Mexanizm93
Big Clucker
 
Mexanizm93's Avatar
 
Join Date: Jan 2013
Location: Russia. Voronezh
Posts: 167
Reputation: 6
Default Re: Не убиваются таймеры

Quote:
Originally Posted by White_116 View Post
Если скорость выполнения функции высокая, иначе создаёшь один большой микролаг. Индивидуальные таймеры же работают сами по себе, т.е. происходит рассеивание выполнение кода в промежутке времени, но пока выполняется поток амх машины.

Набросал проверочный код, выздоравливайте.
PHP Code:
new TestTimer[MAX_PLAYERS+1] = {-1, ...};
public 
OnPlayerConnect(playerid)
{
    if(
TestTimer[playerid] != -1)
    {
        print(
"WTF? I KILL YOU MR. F*CKING TIMER!");
        
KillTimer(TestTimer[playerid]);
        
TestTimer[playerid] = -1;
    }
        
    
TestTimer[playerid] = SetTimerEx("PlayerTestTimer"500true"i"playerid);
    return 
true;
}

public 
OnPlayerDisconnect(playeridreason)
{
    if(
TestTimer[playerid] != -1)
    {
        print(
"WTF? F*CKING TIMERS!");
    }
    else
    {
        
KillTimer(TestTimer[playerid]);
        
TestTimer[playerid] = -1;
    }
    return 
true;
}

forward PlayerTestTimer(playerid);
public 
PlayerTestTimer(playerid)
{
    static new 
OldTickCount 0;
    
printf("PlayerTestTimer(%d) TimeElapsed: %d"playerid, (GetTickCount() - OldTickCount));
    
OldTickCount GetTickCount();
    return 
1;

White, спасибо за ответ. Всё понятно
__________________
We do not drink vodka every day and do not play the balalaika you think about us. ^_^ © Mexanizm
Mexanizm93 is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Таймеры Josipo Русский/Russian 4 17/01/2016 05:02 PM
Таймеры Prolific Русский/Russian 7 30/08/2015 03:41 PM
Таймеры AlexeyTrekkkk Русский/Russian 14 21/07/2014 01:14 AM


All times are GMT. The time now is 09:34 AM.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.