Что возвращает GetTickCount() после переполнения счетчика? - страница 3

 
Господа, вы почему-то забываете, что GetTickCount() может иметь и только положительное значение, т.к. в документации указывается, что оно может быть не INT, а UINT - а он беззнаковый и больше INT в 2 раза. Вот что будет дальше тогда?

Жаль, что TheXpert не объяснил, как бороться с переполнением.

Мой советник работает на VPS постоянно и я очень боюсь этой непредсказуемости. А как VPS перегружать, чтоб сбросить таймер? Ха-ха. :)

 
Renat:
Так как значение DWORD (беззнаковое 32битное число), то счетчик просто переходит через ноль и идет дальше. После ноля идет 1,2,3 ...
 
lebentz:
Господа, вы почему-то забываете, что GetTickCount() может иметь и только положительное значение, т.к. в документации указывается, что оно может быть не INT, а UINT - а он беззнаковый и больше INT в 2 раза. Вот что будет дальше тогда?

Жаль, что TheXpert не объяснил, как бороться с переполнением.

Мой советник работает на VPS постоянно и я очень боюсь этой непредсказуемости. А как VPS перегружать, чтоб сбросить таймер? Ха-ха. :)

Попробуйте повычитать беззнаковые целые друг из друга с присвоением результата в беззнаковое же целое.

Вы удивитесь, но разница tick_count - prev_tick_count даст правильное значение даже при переходе через 0. То есть, tick_count=5, prev_tick_count=0xFFFFFFF7, например

Проверьте!

 
каким именно числовым значением ограничен GetTickCount() в милисекундах и GetTickCount64() ?
 
ruslan #:
каким именно числовым значением ограничен GetTickCount() в милисекундах и GetTickCount64() ?

Так как GetTickCount() имеет тип uint, то и ограничен он значением UINT_MAX - 4 294 967 295. Это максимальное количество миллисекунд.

Приводим к секундам:  4 294 967 295 / 1000 = 4 294 967.295.

Приводим к часам:  4 294 967.295 / 3600 = 1 193.0464708333333333333333333333

Приводим к суткам:  1 193.0464708333333333333333333333 / 24 = 49.710269618055555555555555555556.

Именно так и сказано в справке:

Так как время хранится как беззнаковое целое, то он переполняется каждые 49.7 дней при непрерывной работе компьютера.


Аналогичная ситуация с расчетами для GetTickCount64(). Возвращаемое значение - ulong. Значит максимальное ULONG_MAX - 18 446 744 073 709 551 615. В сутках это 213 503 982 334.6 или более, чем 580 млн. лет. Исходя из того, что вряд ли какой-то компьютер проработает такое время, в справке написано:

GetTickCount64() может использоваться при неограниченном времени работы компьютера и не боится переполнения.

 
Ihor Herasko #:

Так как GetTickCount() имеет тип uint, то и ограничен он значением UINT_MAX - 4 294 967 295. Это максимальное количество миллисекунд.

Приводим к секундам:  4 294 967 295 / 1000 = 4 294 967.295.

Приводим к часам:  4 294 967.295 / 3600 = 1 193.0464708333333333333333333333

Приводим к суткам:  1 193.0464708333333333333333333333 / 24 = 49.710269618055555555555555555556.

Именно так и сказано в справке:


Аналогичная ситуация с расчетами для GetTickCount64(). Возвращаемое значение - ulong. Значит максимальное ULONG_MAX - 18 446 744 073 709 551 615. В сутках это 213 503 982 334.6 или более, чем 580 млн. лет. Исходя из того, что вряд ли какой-то компьютер проработает такое время, в справке написано:

думал вообще (2^31)-1=2147483648-1=2147483647 ну тоесть 0....2147483647

для моих расчетов в МИКРОсекндах надо на 1000000 или на 100000 делить ?.... конец дня от ковида голова не соображает мыслями долго собираюсь

 
ruslan #:

думал вообще (2^31)-1=2147483648-1=2147483647 ну тоесть 0....2147483647

Это для типа int, а тут - uint, т. е. в два раза больше.

для моих расчетов в МИКРОсекндах надо на 1000000 или на 100000 делить ?.... конец дня от ковида голова не соображает мыслями долго собираюсь

Обе указанные функции оперируют миллисекундами. Если нужны микросекунды, то используйте функцию GetMicrosecondCount()

Причина обращения: