Главная
страница 1



Дата печати 30.10.2006 11:35 a10/p10

Часы и таймеры

Часы

time()

clock_gettime()

clock_settime()

clock_getres()

Для хранения интервала времени, выраженного в секундах, используются переменные типа time_t.

Функция time() позволяет получить значение часов с точностью до 1 секунды. Эта функция позволяет опрашивать только системные часы.

time


Синтаксис

#include <time.h>

time_t time(time_t *tloc);

Для более точного измерения времени используется структура timespec, которая содержит следующие элементы:







Тип элемента

Идентификатор элемента

Описание




time_t

tv_sec

секунды




long

tv_nsec

наносекунды

Допустимым значением элемента tv_nsec является величина, большая или равная нулю и меньшая количества наносекунд в 1 секунде (1000 млн.). Временной интервал, описываемый данной структурой, составляет

(tv_sec * 1,000,000,000 + tv_nsec) наносекунд.

Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года.

Структура tm позволяет хранить дату и время в общепринятом виде. Она содержит следующие элементы:






Тип элемента

Идентификатор элемента

Описание




int

tm_sec

секунды




int

tm_min

минуты




int

tm_hour

часы (с 0)




int

tm_mday

день месяца (с 1)




int

tm_mon

месяц (с 0)




int

tm_year

год с 1900




int

tm_wday

день недели (воскресенье - 0)




int

tm_yday

день в году (с 0)




int

tm_isdst

флаг "летнее время"

Система всегда содержит, по крайней мере, одни часы с идентификатором CLOCK_REALTIME (системные часы). Значение этих часов интерпретируется как календарное время, то есть время (в секундах и наносекундах), истекшее с 0 часов 1 января 1970 года.

Функция clock_settime() позволяет установить показания часов, функция clock_gettime() - опросить показания часов, а clock_getres() - узнать разрешающую способность часов. Все три функции работают с высокой точностью, так как используют структуру timespec. Отметим, однако, результаты измерения времени не могут быть точнее, чем разрешающая способность часов.


clock_gettime


Синтаксис

#include <time.h>

int clock_gettime(

clockid_t clock_id,

struct timespec *tp);

Аргументы



clock_id

идентификатор часов;

tp

указатель на структуру timespec, в которую записываются показания часов.

Описание

Функция clock_gettime() записывает текущие показания часов clock_id в структуру timespec, на которую указывает аргумент tp.


clock_settime


Синтаксис

#include <time.h>

int clock_settime(

clockid_t clock_id,

const struct timespec *tp);

Описание

Функция clock_settime() устанавливает часы, указанные аргументом clock_id, в соответствии со значением, определенным аргументом tp. Если указанное аргументом tp значение времени не кратно разрешающей способности указанных часов, то оно уменьшается до наибольшего кратного значения.


clock_getres


Синтаксис

#include <time.h>

int clock_getres(

clockid_t clock_id,

struct timespec *res);

Описание

Функция clock_getres() позволяет выяснить разрешающая способность часов. Если значение аргумента res не равно NULL, то разрешающая способность указанных часов будет записана в структуру timespec, на которую указывает аргумент res.

Функции localtime() и localtime_r() позволяют получить локальное время, а функции gmtime() и gmtime_r() - мировое время. Все четыре функции формируют результат в структуре tm, а в качестве исходных данных получают календарное время в секундах, то есть количество секунд, истекших с 0 часов 1 января 1970 года, UTC. Таким образом, исходные данные для этих функций можно получить с помощью функции time().

Функция mktime() преобразует локальное время, записанное в структуре tm, в календарное время (количество секунд, истекшее с 0 часов 1 января 1970 года, UTC).



#include

#include

#include

#include

#include
struct timeval tv1,tv2;
int main(int argc, char **argv)

{

int i, ntimes=100000;

float d1;

gettimeofday(&tv1, NULL);

for(i=0;i

d1=sin(i)

;
gettimeofday(&tv2, NULL);

tv2.tv_usec += 1000000*(tv2.tv_sec-tv1.tv_sec);

d1 = (float)(tv2.tv_usec - tv1.tv_usec)/1000000.;
printf("\ndelta sec %f \n", d1);
}

Таймеры

nanosleep()

sleep()

alarm().

timer_create()

timer_settime()

timer_gettime()

timer_getoverrun()

timer_delete()

Для посылки сигнала в определенный момент в будущем можно использовать функцию alarm(). Эта функция предписывает системе сгенерировать сигнал SIGALRM через указанный интервал времени (в секундах).

Программные таймеры позволяют запланировать выполнение какой-либо деятельности в определенный момент времени в будущем. Для создания таймера используется функция timer_create(). Одним из аргументов этой функции является структура sigevent, которая определяет вид оповещения о срабатывании таймера (например, посылка сигнала или выполнение указанной функции).

Функция timer_create() только создает таймер, но не запускает его. Установка и запуск таймера производится функцией timer_settime(). Функция timer_settime() определяет время первого срабатывания таймера, а также период срабатывания (если требуется периодическое срабатывание таймера). Для первого срабатывания таймера можно указать либо абсолютное время срабатывания (то есть таймер сработает, когда часы покажут указанное время), либо относительное (интервал времени, через который должен сработать таймер).

Если указан период срабатывания таймера, то после каждого срабатывания таймера он будет заново установлен и запущен со значением, равным указанному периоду. Функция timer_settime() также позволяет остановить (сбросить) таймер.

Функция timer_gettime() позволяет опросить время, оставшееся до срабатывания таймера, а также период срабатывания.

Если для оповещения о срабатывании таймера используется сигнал, то при повторном срабатывании таймера сигнал не будет послан, если предыдущий сигнал не был обработан. С помощью функции timer_getoverrun() можно получить количество срабатываний таймера, произошедших между моментом генерирования сигнала (постановки в очередь) и моментом доставки или приема.

Когда потребность в таймере отпадет, его можно удалить функцией timer_delete().

Сброс и переустановка таймера не влияет на ранее выданные сигналы о срабатывании таймера, даже если они еще не были обработаны.

timer_create


Синтаксис

#include <signal.h>

#include <time.h>

int timer_create(

clockid_t clock_id,

struct sigevent *evp,

timer_t *timerid);

Аргументы

clock_id идентификатор часов, с которыми будет связан создаваемый таймер

evp указатель на структуру sigevent, описывающую способ оповещения о срабатывании таймера

timerid указатель на переменную, в которую будет помещен идентификатор созданного таймера



Описание

Функция timer_create() создает таймер, используя часы clock_id для отсчета времени. В случае успешного выполнения функции в переменную типа timer_t, на которую указывает аргумент timerid будет помещен идентификатор созданного таймера. В дальнейшем этот идентификатор может быть использован при вызове функций timer_settime(), timer_gettime(), timer_getoverrun() и timer_delete().

Аргумент evp, если он не равен NULL, должен указывать на структуру sigevent, описывающую способ оповещения о срабатывании таймера. Эта структура должна быть заранее создана прикладной программой.

timer_settime


#include <time.h>

int timer_settime(

timer_t timerid,

int flags,

const struct itimerspec *value,

struct itimerspec *ovalue);

Аргументы

timerid

идентификатор таймера;

flags

флаги;

value

устанавливаемое значение таймера;

ovalue

старое значение таймера.

Описание

Функция timer_settime() устанавливает время до следующего срабатывания таймера, заданного аргументом timerid. Устанавливаемое значение находится в структуре itimerspec, на которое указывает аргумент value. Эта структура содержит следующие элементы.

srtuct timespec it_interval периодичность запуска

struct timespec it_value значение таймера

Если значения времени, указанные элементами it_interval или it_value не кратны разрешающей способности часов, связанных с таймером, то они будут округлены до большего значения, кратного разрешающей способности.

Если флаг TIMER_ABSTIME в аргументе flags не установлен, то время до следующего срабатывания таймера равно интервалу, заданному в поле it_value структуры, указанной аргументом value. Если флаг TIMER_ABSTIME в аргументе flags установлен, то время до следующего срабатывания таймера равно разности между абсолютным временем, заданным в поле it_value структуры, указанной аргументом it_value, и текущим показанием часов, связанных с таймером. То есть таймер сработает, когда часы покажут время, заданное в поле it_value структуры value. Если указанное время уже истекло, то функция считается выполненной успешно, и будет выдано извещение об истечении времени.

Если при вызове функции timer_settime() таймер уже включен, то время срабатывания таймера будет переустановлено, т.е. заменено значением, указанным в value.

Если значение it_value в структуре, на которую указывает аргумент value не равно 0, то функция timer_settime() запустит таймер. В противном случае таймер не будет включен или будет остановлен, если он был включен ранее.

Если значение it_interval не равно нулю, то после срабатывания таймер будет установлен и запущен заново со значением, равным элементу it_interval структуры, на которую указывает аргумент value. Таким образом, таймер будет периодическим (многоразовым).

Если аргумент ovalue не равен NULL, то в структуру, на которую он указывает, будет записано предыдущее значение времени до срабатывания таймера (даже если при установке таймера был установлен флаг TIMER_ABSTIME) или 0, если таймер не был запущен, а также предыдущее значение периодичности запуска таймера. Эти значения зависят от разрешающей способности таймера и равны в точности тем значениям, которые были бы возвращены при вызове timer_gettime() в этот момент времени.

Если для оповещения о срабатывании таймера используется сигнал, то при повторном срабатывании таймера сигнал не будет послан, если предыдущий сигнал не был обработан. С помощью функции timer_getoverrun() можно получить количество срабатываний таймера, произошедших между моментом генерирования сигнала (постановки в очередь) и моментом доставки или приема.

Выключение или переустановка таймера не влияет на ранее выданные сигналы о срабатывании таймера, даже если они еще не были обработаны.



Задержка выполнения

Функции nanosleep() и sleep() позволяют приостановить текущий процесс (поток управления) на указанный интервал времени.

Функция nanosleep() является более точной, чем функция sleep(). Функция sleep() позволяет указывать время только с точностью до секунды, тогда как nanosleep() работает с точностью, которая обеспечивается разрешающей способностью часов.

Продолжительность приостановки может превосходить заданную из-за разрешающей способности часов, а также накладных расходов системы. Однако продолжительность приостановки не может быть меньше указанной, если только не поступил какой-либо сигнал.



posix_timer_abs.C

#include

#include

#include

#include

#include


void callme( int signo, siginfo_t* evp, void* ucontext )

{

time_t tim = time(0);


cerr << "callme: " << evp->si_value.sival_int

<< ", signo: " << signo << ", " << ctime(&tim);

}
int main()

{

struct sigaction sigv;



struct sigevent sigx;

struct itimerspec val;

struct tm do_time;

timer_t t_id;


sigemptyset( &sigv.sa_mask );

sigv.sa_flags = SA_SIGINFO;

sigv.sa_sigaction = callme;
if (sigaction( SIGUSR1, &sigv, 0) == -1)

{

perror("sigaction");



return 1;

}
sigx.sigev_notify = SIGEV_SIGNAL;

sigx.sigev_signo = SIGUSR1;

sigx.sigev_value.sival_int = 12;


if ( timer_create( CLOCK_REALTIME, &sigx, &t_id ) == -1)

{

perror("timer_create");



return 1;

}
/* Set timer to go off at April 20, 1996, 10:27am */

do_time.tm_hour = 10;

do_time.tm_min = 27;

do_time.tm_sec = 30;

do_time.tm_mon = 3;

do_time.tm_year = 96;

do_time.tm_mday = 20;


val.it_value.tv_sec = mktime( &do_time );

val.it_value.tv_nsec = 0;

val.it_interval.tv_sec = 15;

val.it_interval.tv_nsec = 0;


cerr << "timer will go off at: " << ctime(&val.it_value.tv_sec);
if (timer_settime( t_id, TIMER_ABSTIME, &val, 0 ) == -1 )

{

perror("timer_settime");



return 2;

}
/* do something then wait for the timer to expire twice*/

for (int i=0; i < 2; i++ )

pause();
if (timer_delete( t_id ) ==-1)

{

perror( "timer_delete" );



return 3;

}
return 0;



}






Смотрите также:
Дата печати 30. 10. 2006 11: 35 a10/p10 Часы и таймеры Часы
102.13kb.
1 стр.
«Солнечные часы»
178.8kb.
1 стр.
Тематический план изучения дисциплины ( 3 семестр одо) № Тема Лек ции часы Семи нар занятия часы Самост работа часы Итого
98.98kb.
1 стр.
Геленджик-2010 п. Кабардинка Гостевой домик «солнечные часы» Небольшая, очень уютная частная гостиница «Солнечные часы»
35.89kb.
1 стр.
Время как цикл. Почему циферблат часов размечен цифрами от 1 до 12 И. Н. Гансвинд Время и небо. Природные часы. Знаки Зодиака. «Крестьянские»
181.97kb.
1 стр.
Инструкция по эксплуатации nec-hitachi corp. 2010-2011 Часы-календарь «gps nixie clock»
43.48kb.
1 стр.
Часы всех видов и их части
112.71kb.
1 стр.
Часы всех видов и их части Примечания
440.19kb.
2 стр.
Часы Le Chic не просто часы
28.66kb.
1 стр.
Пособие для продавца часы Hermle
245.72kb.
1 стр.
Новогодние традиции
20.35kb.
1 стр.
Конкурсе «Классные часы на экологическую тему»
55.54kb.
1 стр.