Иногда требуется сделать в программе цикл, работающий кратное секундам время. Есть множество способов для это.
Я предложу, как мне кажется, очень простой и очень переносимый способ.
Стандартная функция time()
возвращает так называемое UNIX-время в секундах. Проблема в том, что секунда, номер которой возвращает эта функция, может быть уже через пару микросекунд перейдет на следующую. Надо как-то “подравняться” к границе секунд.
Фрагмент кода, в котором рабочий цикл имеет условие, позволяющее ему работать время, близкое к одной секунде:
... // Получаем номер текущей секунды time_t started = time(NULL); // Ждем перехода на следующую секунду while (time(NULL) == started); // И сразу запускаем рабочий цикл started = time(NULL); do { // Цикл, работающий в течение секунды ... } while (time(NULL) == started); ...
Тут, конечно, есть недостатки. Подготовительный цикл ожидания перехода на следующую секунду может “есть” процессорное время, если time()
для вашей системы не отдает time slice. Также сложно сделать какой-то надежный универсальный шаблон или макрос, так как надо гарантированно избежать какого-либо лишнего кода, чтобы не терять точность.
В целом, такой прием дает рабочему циклу работать время, очень близкое к секунде.
Если знаете, как сделать еще проще — предлагайте.
Другие посты по теме: