LINUX.ORG.RU

Таймеры


0

1

Язык - С. Каков наиболее правильный способ реализации таймеров? Интересуют интервалы от сотен мкс до нескольких секунд. Причем желательно, чтобы время работы обработчика события не влияло на интервал.

★★★★
Ответ на: комментарий от tailgunner

Ух-ты, здорово. Но в общем-то мне нужно 2-3 таймера, поэтому это явный overkill. Видимо я просто остановлюсь на потоках усыпленных usleep-ом.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

> Видимо я просто остановлюсь на потоках усыпленных usleep-ом.

А, так ты в POSIX пишешь? У POSIX есть таймерный API, вообще-то.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Да, действительно. Я как-то не обратил внимания.

alexru ★★★★
() автор топика
Ответ на: комментарий от alexru

> Видимо я просто остановлюсь на потоках усыпленных usleep-ом.

Но тогда тебе никто не гарантирует точность.

smh ★★★
()
Ответ на: комментарий от smh

> Видимо я просто остановлюсь на потоках усыпленных usleep-ом.

Ну, если сделать задержки по poll(2) - точность будет весьма высокой.

rjaan ★★
()

> Язык - С. Каков наиболее правильный способ реализации таймеров? Интересуют интервалы от сотен мкс до нескольких секунд.

man alarm

man settimer

man nanosleep (слип без использования сигналов)

man clock_nanosleep (POSIX, не во всех Unix реализовано)

man timer_create, timer_delete, timer_settime (POSIX, не во всех Unix реализовано)

Предпочитай таймеры слипам. И еще, не мешай в одном коде слипы usleep и sleep с таймерами alarm, settimer, timer_create, так как все эти функции завязаны на сигнале SIGALRM.

Я бы посоветовал использовать settimer/gettimer + nanosleep (если приспичит).

badgopher
()
Ответ на: комментарий от badgopher

Забыл добавить еще select :-) man select

struct timeval tv;

tv.sec = 0;
tv.usec = 500; /* в микросекундах */

select(0, NULL, NULL, &tv);

Работает везде :-)

badgopher
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.