Кроссплатформенный миллисекундный таймер продолжительностью более 49 дней? - PullRequest
2 голосов
/ 06 апреля 2010

Я собираюсь разработать небольшой выделенный сервер на C / C ++, который будет работать вечно. Я искал некоторые функции времени, поскольку для вычислений требуется время в миллисекундах. У меня есть 2 проблемы, с которыми я сталкиваюсь:

  1. Использование 32-битного целого числа для хранения количества миллисекунд с момента начала операции обернется примерно на 49-дневную отметку, обнуляясь. Я думал об использовании 64-битных целых чисел, используя gettimeofday для получения микросекунд, но это подводит меня ко второй части.

  2. Кажется, что нет никаких стандартных системных вызовов для получения истекших миллисекунд, которые не зависят от платформы

Что я должен сделать, чтобы решить обе эти проблемы?

Ответы [ 4 ]

6 голосов
/ 06 апреля 2010
  1. Используйте 64-битное целое число, предполагая, что вам достаточно времени

  2. Вы правы; Там нет стандарта. Одна из возможностей - использовать библиотеку Boost DateTime , поочередно найти другую или бросить свою собственную.

Удачи!

2 голосов
/ 06 апреля 2010

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

Я признаю, что этот вопрос меня несколько озадачил.

Я могу понять необходимость точного определения времени (уровень в миллисекундах, даже микросекунды), но время 50 дней на уровне в миллисекундах кажется ... странным.

Возможно, вам следует сначала проанализировать свои потребности, но редко требуется более 6 или 7 значащих цифр ... и я боюсь, что вы пытаетесь получить один размер, подходящий для всех объектов продолжительности.

Возможно, вам следует вместо этого классифицировать продолжительность:

  • не более нескольких минут> использовать точность в миллисекундах
  • в противном случае> использовать вторую точность (известный счет с 1 января 1970 г.)

Потому что ... в чем смысл 1/10 секунды по шкале 2 месяцев?

0 голосов
/ 06 апреля 2010

ответ на 1: Если измеряемый вами «временной интервал в миллисекундах» составляет менее 20 дней, вы можете вычесть время в виде значений без знака и проверить результат как значение со знаком. Это должно дать правильный результат с таймерами переноса (перенос от 0xffffffff до 0x00000000). Если ваше время превышает 20 дней, вам нужно больше битов.

0 голосов
/ 06 апреля 2010

Очевидные. Используйте 64-битные целые числа с кодом, специфичным для платформы, чтобы получить количество миллисекунд. В Unix, включая OSX, вы хотите gettimeofday. В Windows удача в получении надежного источника времени с точностью до миллисекунды; код в библиотеке Tcl для этого действительно сложен, поскольку в этой области есть несколько злых уловок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...