PDA

Просмотр полной версии : [Вопрос] Timer



punkochel
23.06.2019, 22:22
Всем привет! Задался я тут вопросом, казалось бы очень простым, но меня терзают смутные сомнения и паранойя того, что из-за возможной нагрузки на сервер секундный таймер меня подведет.

public SecondUpdate()
{
new hour, minute, second;
gettime(hour, minute, second);
if(minute == 0 && second == 0)
{
PayDay();
}
return 1;
]

Решение есть, но оно скорее похоже на костыль из китайской пластмассы. Можно создать переменную вещественного типа и проверять ее секунд 5.


public SecondUpdate()
{
new hour, minute, second;
gettime(hour, minute, second);
if(minute == 0 && second > 5) LaunchPayDay = true;
if(minute == 0 && second <= 5)
{
if(LaunchPayDay == true)
{
LaunchPayDay = false;
PayDay();
}
}
return 1;
}

Извините, но мне стыдно даже за то, что такое решение в голову пришло) Ну а вообще, я думаю суть вопроса понятна. Может быть есть какие-то проверенные способы запуска PayDay.

DeimoS
24.06.2019, 17:04
Во-первых, никаких "возможных нагрузок, повлиявших на работу секундного таймера" быть не должно. Если такое вдруг появится - причину нужно отыскивать и исправлять, ибо подобные задержки ненормальны и могут повлиять не только на секундный таймер.

Во-вторых, PayDay и прочие действия, которые нужно выполнять не раз в секунду, лучше запускать с конкретным интервалом. Для этого берём вот этот (https://github.com/udan11/samp-plugin-timerfix/releases) плагин (который, к тому же, делает таймеры гораздо более точными) и используем вот эту функцию для запуска таймера:

/**
* <summary>An improved version of SetTimer.</summary>
* <param name="func">Name of the public function to call.</param>
* <param name="interval">Interval in milliseconds.</param>
* <param name="delay">Time after this timer should be called for the first time.</param>
* <param name="count">How many times it should repeat before it's killed (-1 for unlimited).</param>
* <returns>The ID of the timer.</returns>
*/
native SetTimer_(func[], interval, delay, count);
Нас интересует параметр "delay". Собственно, при старте сервера высчитываем то, сколько миллисекунд осталось до нового часа (надеюсь, в школе учили переводить часы в минуты, минуты в секунды и т.п.) и указываем получившийся результат в "delay". А уже в "interval" указываем 3600000. Всё, таймер будет срабатывать каждый час ровно в 00 минут (ну если ты правильно сделаешь вычисление времени для "delay").

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