[Include] a_timer
#1

Этот инклуд добавляет новые функции для работы с таймерами:
PHP код:
TSetTimer(const funcname[], intervalrepeating)
TKillTimer(timerid
С помощью этих функций можно использовать точные таймеры, гораздо точнее стандартных.
+ На данный момент самый точный способ использования таймеров
- Для таймеров, меньше 250 мс точность не гарантируется при стандартных параметрах. Можно изменить параметр UPDATE_TIMERS на требуемое число и тогда точность будет, но сервер будет сильнее нагружатся. Уменьшать этот параметр крайне не желательно!

Пользоваться этим инклудом очень легко. Всё точно так же как и стандартными таймерами, только для запуска нужно использовать TSetTimer(название функции, время, повторение (0\1)), а для отключения TKillTimer(ID таймера).

Тесты точности таймеров проводились на повторяющемся минутном таймере. В стандартных таймера при увеличении времени таймера отклонение так же увеличивалось. С a_timer отклонение будет всегда одинаковое.


Стандартные таймеры: Отклонение 4746-4920 мс
a_timer: Отклонение 0-250 мс

Внимание! Перед использованием изменить в инклуде параметр MAX_TIMERS на нужное значение!
http://pastebin.com/idUmmFzR
Reply
#2

Выложи пожалуйста на http://pastebin.com/
Reply
#3

Выложил.
Reply
#4

Во первых таймеры не тормозят, а тормозят ваши потоки. Во вторых код полная херня. Вы даже не подумали о TimerID при удалении таймера.
pawn Код:
stock KillTimerEx(timerid) TimerInterval[timerid] = 0;
Таким образом выходит MAX_TIMERS общее не рациональное количество использования функции TSetTimer а не таймеров вообще. т.е. создав 10 таймеров, удалив из них 9 таймеров, 9 слотов не освободятся.

p.s. Если ваши таймеры (стандартные) дают погрешности больше 50ms, то у вас плохой код. Большие интервалы не замеряют SetTimer("name", много_времени, true\false), gettime вам в помощь. Вообще задержка таймера это показатель скорости выполнения потока. Чем больше задержка, тем больше лагов на сервере, таймер лишь указывает вам на это а не создаёт эти лаги.
Reply
#5

Quote:
Originally Posted by AirKite
Посмотреть сообщение
Во первых таймеры не тормозят, а тормозят ваши потоки. Во вторых код полная херня. Вы даже не подумали о TimerID при удалении таймера.
pawn Код:
stock KillTimerEx(timerid) TimerInterval[timerid] = 0;
Таким образом выходит MAX_TIMERS общее не рациональное количество использования функции TSetTimer а не таймеров вообще. т.е. создав 10 таймеров, удалив из них 9 таймеров, 9 слотов не освободятся.

p.s. Если ваши таймеры (стандартные) дают погрешности больше 50ms, то у вас плохой код. Большие интервалы не замеряют SetTimer("name", много_времени, true\false). Вообще задержка таймера это показатель скорости выполнения потока. Чем больше задержка, тем больше лагов на сервере, таймер лишь указывает вам на это а не создаёт эти лаги.
Мой код? Смищно. Тесты проводились на чистом моде. Код показать?
Слоты поправлю сейчас...
Reply
#6

Обновил код. Исправил ошибку со слотами.
Reply
#7

А зачем эта точность? Точно нужно считать только время(именно текущее физическое время), но оно узнается не с помощью таймеров, а с помощью функции gettime.
PHP код:
SetTimer("UpdateTimers"TIMERS_UPDATE1
Как ты вообще можешь узнать точность выполнения таймера на 100мс с помощью такого же таймера на 100мс?
Reply
#8

Запусти таймер минут на 10, а он пройдёт через 12-15, в лучшем случае. Как то не очень хорошо.

Точность легко измеряется вот так:
PHP код:
public OnGameModeInit()
{
    
Time GetTickCount();
       
SetTimer("Timer1Start"600001);
    return 
true;
}
public 
Timer1Start()
{
    
printf("Отклонение = %d ms"GetTickCount()-Time-60000);
    return 
1;

Reply
#9

Не получил ответ. Зачем все таки измерять таймеры точно? Зачем это может понадобиться? Почему для тебя это "как то не хорошо"?
Reply
#10

Обычно это достаточный аргумент. Тебя я не заставляю пользоваться инклудом, многим пригодится.
А лично я считаю, что когда указываешь во времени 10 минут, то и выполнится он должен через 10 минут, а не 15.
Reply
#11

Я в шоке с некоторых вопросов к автору темы. Точные таймеры - недосягаемая идеальная цель. Автор максимально приблизил время выполнения таймеров к "нормальному".
Reply
#12

1. Количество массивов можно уменьшить
2. Удаление таймера сделано не правильно. После "удаления" таймер будет срабатывать каждые TIMERS_UPDATE
3. Переменная TimerID используется не правильно, поэтому в конце концов будет происходить обращение к несуществующей ячейке
Reply
#13

Quote:
Originally Posted by stabker
View Post
1. Количество массивов можно уменьшить
2. Удаление таймера сделано не правильно. После "удаления" таймер будет срабатывать каждые TIMERS_UPDATE
3. Переменная TimerID используется не правильно, поэтому в конце концов будет происходить обращение к несуществующей ячейке
Блин... Я видимо ссылки перепутал. AirKite уже об этом говорил, а я исправлял. Только не то что то... Сейчас перезалью.

----------

Готово.
Reply
#14

А разве не нужен такой дефайн ещё:

pawn Code:
#define KillTimer KillTimerEx
Reply
#15

Quote:
Originally Posted by OKStyle
View Post
А разве не нужен такой дефайн ещё:

pawn Code:
#define KillTimer KillTimerEx
SetTimerEx же не заменяется в инклуде.
Reply
#16

Quote:
Originally Posted by OKStyle
View Post
А разве не нужен такой дефайн ещё:

pawn Code:
#define KillTimer KillTimerEx
Он не сделал его из-за того, что таймер может быть создан через SetTimerEx

UPD: Alexander_Petrov, я одновременно с вами сообщение отправил. Это не специально
Reply
#17

Quote:
Originally Posted by OKStyle
View Post
А разве не нужен такой дефайн ещё:

pawn Code:
#define KillTimer KillTimerEx
Нет. Я там написал что к сожалению, SetTimerEx я заменить не смог. Поэтому он работает по стандарту.
KillTimer чтобы убить SetTimerEx
KillTimerEx чтобы убить таймеры на a_timer (SetTimer)
Reply
#18

А, вон оно как.
Reply
#19

UPD: Предлагаю такой вариант http://pastebin.com/qfnMv3UZ
Работоспособность не тестировал
Reply
#20

Quote:
Originally Posted by XemyL
View Post
Обычно это достаточный аргумент. Тебя я не заставляю пользоваться инклудом, многим пригодится.
А лично я считаю, что когда указываешь во времени 10 минут, то и выполнится он должен через 10 минут, а не 15.
Т.е. тебе этот инклуд тоже не нужен?)
Пойми, я же не наезжаю на тебя Инклуд работает (без теста понятно), просто хочу узнать для каких целей/задачи, конкретно в сампе/павн, это необходимо?
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)