Как да внедрим таймер с прекъсване в C++?

Използвам 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