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