Хотя во многих реализациях функция time
возвращает текущее время в секундах , не гарантирует того, что каждая реализация сделает это (например, некоторыеможет возвращать миллисекунд вместо секунд ).Таким образом, более переносимым решением является использование функции difftime
.
difftime
гарантируется стандартом C для возврата разницы во времени в секунд между двумя time_t
значениями.Таким образом, мы можем написать переносную функцию временной задержки, которая будет работать на всех совместимых реализациях C .
#include <time.h>
void delay(double dly){
/* save start time */
const time_t start = time(NULL);
time_t current;
do{
/* get current time */
time(¤t);
/* break loop when the requested number of seconds have elapsed */
}while(difftime(current, start) < dly);
}
Одна оговорка с time
и difftime
Функция заключается в том, что стандарт C никогда не определяет гранулярность.Большинство реализаций имеют гранулярность одну секунду .Хотя это нормально для задержек длительностью несколько секунд , наша функция задержки может слишком долго ждать задержек менее одной секунды .
Существует портативная стандартная альтернатива C: функция clock
.
Функция clock
возвращает наилучшее приближение реализации к времени процессора, используемому программой с начала определяемой реализацией эпохи, связанной столько для вызова программы.Чтобы определить время в секундах, значение, возвращаемое функцией clock
, следует разделить на значение макроса CLOCKS_PER_SEC
.
Функциональное решение clock
очень похоже на наше функциональное решение time
:
#include <time.h>
void delay(double dly){
/* save start clock tick */
const clock_t start = clock();
clock_t current;
do{
/* get current clock tick */
current = clock();
/* break loop when the requested number of seconds have elapsed */
}while((double)(current-start)/CLOCKS_PER_SEC < dly);
}
В этом случае есть оговорка, аналогичная time
и difftime
: гранулярность clock
функция оставлена для реализации.Например, машины с 32-разрядными значениями для clock_t
с разрешением в микросекунд могут закончить перенос значения, возвращенного clock
через 2147 секунд (около 36 минут).
Таким образом, рассмотрите возможность использования time
и difftime
реализации функции задержки для задержек продолжительностью не менее одной секунды и реализацию clock
для задержек продолжительностью менее одной секунды .
Последнее предупреждение: clock
возвращает процессорное время вместо календарное время ;clock
может не соответствовать фактическому прошедшему времени (например, если процесс спит).