PDA

Просмотр полной версии : [Function] GetTickCount & tickcount FIX



Пельмень
06.01.2017, 16:14
Описание
При беспрерывной работе сервера больше, чем 24 дня GetTickCount() и tickcount() будут вызывать проблемы. (Ибо будут возвращать значение, больше чем доступно для Integer)
Хотфикс в хату собственно


stock h@@k_@GetTickCount()
{
new _@tRET = GetTickCount();
return (_@tRET < 0) ? (_@tRET = (0x7FFFFFFF) + _@tRET) : (_@tRET);
}

#if defined _ALS_GetTickCount
#undef GetTickCount
#else
#define _ALS_GetTickCount
#endif
#define GetTickCount h@@k_@GetTickCount

stock h@@k_@tickcount()
{
new _@tRET = tickcount();
return (_@tRET < 0) ? (_@tRET = (0x7FFFFFFF) + _@tRET) : (_@tRET);
}

#if defined _ALS_tickcount
#undef tickcount
#else
#define _ALS_tickcount
#endif
#define tickcount h@@k_@tickcount

Автор
Пельмень

DeimoS
06.01.2017, 16:23
Это, конечно, хорошо, но кто в здравом уме будет держать сервер 24 дня в рабочем состоянии?
Так, вопрос за засыпку :)

Пельмень
06.01.2017, 16:26
Это, конечно, хорошо, но кто в здравом уме будет держать сервер 24 дня в рабочем состоянии?
Так, вопрос за засыпку :)

Даже не знаю, возможно какой ни будь тестовый

DeimoS
06.01.2017, 16:57
Даже не знаю, возможно какой ни будь тестовый

Гораздо логичнее будет просто настроить авторестарт, чем ради сомнительного фикса заставлять сервер делать лишние действия каждый вызов tickcount/GetTickCount =)
А если уж совсем припрёт, можно использовать менее завистливую от Integer gettime для точных отсчётов.

ziggi
06.01.2017, 18:50
Зачем это? Этот "фикс" не решает ни одной из проблем, которые могут возникнуть.

Обычно эти функции используются для определения количества времени, прошедшего с определённого момента. Допустим, что GetTickCount() вернул 2147483647 (максимальное число, которое оно может вернуть), следующим тиком эта функция вернёт -2147483648, но с этим "фиксом" это будет 0. И после попытки определения времени, прошедшего с первого тика, результатом будет 2147483647 - 0 = 2147483647, что, естественно, неправильно.

Вот здесь можно посмотреть на реальный фикс: http://pro-pawn.ru/showthread.php?14127

Но, по сути, здесь вообще ничего можно не фиксить, вычисление выражения 2147483647 - -2147483648 даст нужный результат: 1, что правильно. Правда такая игра с переполнением, как по мне, не лучшая практика.