Главная Другое
Экономика Финансы Маркетинг Астрономия География Туризм Биология История Информатика Культура Математика Физика Философия Химия Банк Право Военное дело Бухгалтерия Журналистика Спорт Психология Литература Музыка Медицина |
страница 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, которая содержит следующие элементы:
Допустимым значением элемента tv_nsec является величина, большая или равная нулю и меньшая количества наносекунд в 1 секунде (1000 млн.). Временной интервал, описываемый данной структурой, составляет (tv_sec * 1,000,000,000 + tv_nsec) наносекунд. Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года. Структура tm позволяет хранить дату и время в общепринятом виде. Она содержит следующие элементы:
Система всегда содержит, по крайней мере, одни часы с идентификатором 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_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); Аргументы
Описание Функция 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); }
{ 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;
{ perror("sigaction"); return 1; }
sigx.sigev_signo = SIGUSR1; sigx.sigev_value.sival_int = 12; if ( timer_create( CLOCK_REALTIME, &sigx, &t_id ) == -1) { perror("timer_create"); return 1; }
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; }
for (int i=0; i < 2; i++ ) pause();
{ perror( "timer_delete" ); return 3; }
} Смотрите также: Дата печати 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 стр.
|