*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

понедельник, 13 апреля 2009 г.

Задержка в одну секунду через time()

Иногда требуется сделать в программе цикл, работающий кратное секундам время. Есть множество способов для это.

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

Стандартная функция time() возвращает так называемое UNIX-время в секундах. Проблема в том, что секунда, номер которой возвращает эта функция, может быть уже через пару микросекунд перейдет на следующую. Надо как-то "подравняться" к границе секунд.

Фрагмент кода, в котором рабочий цикл имеет условие, позволяющее ему работать время, близкое к одной секунде:

...
// Получаем номер текущей секунды
time_t started = time(NULL);
// Ждем перехода на следующую секунду
while (time(NULL) == started);
// И сразу запускаем рабочий цикл
started = time(NULL);
do {
// Цикл, работающий в течение секунды
...
} while (time(NULL) == started);
...

Тут, конечно, есть недостатки. Подготовительный цикл ожидания перехода на следующую секунду может "есть" процессорное время, если time() для вашей системы не отдает time slice. Также сложно сделать какой-то надежный универсальный шаблон или макрос, так как надо гарантированно избежать какого-либо лишнего кода, чтобы не терять точность.

В целом, такой прием дает рабочему циклу работать время, очень близкое к секунде.

Если знаете, как сделать еще проще — предлагайте.


Посты по теме:

Комментариев нет:

Отправить комментарий