Хотя во многих реализациях функция time
возвращает текущее время в секундах< /em>, нет гарантии, что каждая реализация будет делать это (например, некоторые могут возвращать миллисекунды, а не секунды). Таким образом, более переносимым решением является использование функции difftime
.
Стандарт C гарантирует, что difftime
возвращает разницу во времени в секундах между двумя значениями 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
может не соответствовать фактическому прошедшему времени (например, если процесс спит).
person
Vilhelm Gray
schedule
29.07.2013