Как реализовать таймер с прерыванием на С++?

Я использую компилятор GCC и C++ и хочу создать таймер, который вызывает прерывание, когда обратный отсчет равен 0.

Любые идеи? Заранее спасибо.

ИЗМЕНИТЬ

Благодаря Адаму я знаю, как это сделать.

Теперь. А как насчет нескольких таймеров, работающих параллельно?

На самом деле, эти таймеры предназначены для чего-то очень простого. В NCURSES у меня есть список вещей. Когда я нажимаю клавишу, одна из вещей меняет цвет на 5 секунд. Если я нажму другую клавишу, другая вещь в списке сделает то же самое. Это похоже на выделение строк в зависимости от пользовательского ввода. Есть ли более простой способ сделать это?


person Tomas    schedule 22.10.2010    source источник
comment
Это далеко не достаточно информации о приложении. Это приложение командной строки, графическое приложение, фоновая сетевая служба или что? У него уже есть основной цикл событий? Использует ли он для этого какую-то структуру?   -  person Ben Voigt    schedule 23.10.2010
comment
Программа использует интерфейс ncurses. И да, у него есть основной цикл событий.   -  person Tomas    schedule 23.10.2010


Ответы (2)


Один из способов сделать это — использовать системный вызов alarm(2) для отправки SIGALRM вашему процессу. когда таймер истекает:

void sigalrm_handler(int sig)
{
    // This gets called when the timer runs out.  Try not to do too much here;
    // the recommended practice is to set a flag (of type sig_atomic_t), and have
    // code elsewhere check that flag (e.g. in the main loop of your program)
}

...

signal(SIGALRM, &sigalrm_handler);  // set a signal handler
alarm(10);  // set an alarm for 10 seconds from now

Обратите внимание на предупреждения на справочной странице alarm:

alarm() и setitimer() используют один и тот же таймер; вызовы одного будут мешать использованию другого.

sleep() может быть реализован с помощью SIGALRM; смешивание вызовов alarm() и sleep() — плохая идея.

Задержки планирования, как всегда, могут привести к задержке выполнения процесса на произвольное время.

person Adam Rosenfield    schedule 22.10.2010

Простой переносимый способ реализации таймера прерывания — использование Boost.ASIO. . В частности, класс boost::asio::deadline_timer позволяет указать продолжительность времени и обработчик прерывания, который будет выполняться асинхронно, когда время таймера истечет.

См. здесь краткое руководство и демонстрация.

person Charles Salvia    schedule 22.10.2010