Вопрос:
Я использую компилятор GCC и С++, и я хочу создать таймер, который вызывает прерывание, когда обратный отсчет равен 0.
Любые идеи? Спасибо заранее.
ИЗМЕНИТЬ
Благодаря Адаму я знаю, как это сделать.
Теперь. Как насчет нескольких таймеров, работающих параллельно?
Собственно, эти таймеры для чего-то очень простые. В NCURSES у меня есть список вещей. Когда я нажимаю клавишу, одна из вещей изменит цвета на 5 секунд. Если я нажму другую клавишу, другая вещь в списке сделает то же самое. Он как бы подчеркивает строки в зависимости от пользовательского ввода. Есть ли более простой способ сделать это?
Лучший ответ:
Один из способов сделать это – использовать системный вызов 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() – плохая идея.
Запланированные задержки могут, как всегда, заставлять процесс задерживаться на произвольное время.
Ответ №1
Простой, переносимый способ реализации таймера прерывания использует Boost.ASIO. В частности, boost:: asio:: deadline_timer class позволяет указать продолжительность времени и обработчик прерываний, который будет выполняться асинхронно при запуске таймера из.
Смотрите здесь для быстрого обучения и демонстрации.
Ответ №2
Вот способ решить эту проблему
а также как время, так и пространство ( “сложность” )
и никогда не используйте более одного таймера
событие “из служб операционной системы.
(1) Терминология
Давайте начнем с некоторой
терминологии, а затем попытаться быть более четкими
давая некоторые гипотетические примеры:
Итак, в нашей работе, со временем, мы
обнаруживать (получать) “события”; мы получаем
эти события, возможно, несколько тысяч или
больше в секунду; каждое событие имеет “время”,
то есть “часы на стене”, обычно
в будущем, когда событие должно
“действие” (повышение, триггер, генерация
прерывание, сообщение, состояние и т.д.). Для
событие, которое имеет самое раннее время, мы
хотите вызвать действие во время
это событие или как только мы сможем после этого
время.
Итак, по аналогии, наша проблема подобна TO
Список DO:
event = видеоконференция с CA
время = 9:15 утра
action = запуск программного обеспечения для видео
событие = принять душ
время = 7:00 утра
action = wake SO
event = пробуждение
время = 6:45 утра
action = играть на Anvil Chorus
(2) Решение первого класса
Выберите положительное целое число n, скажем, 1024.
Перейдите к классическому алгоритму “сортировка кучи”
и выделить и определить кучу в массиве
x (1), x (2),…, x (n). Каждый компонент
этот массив можно использовать для хранения данных
для одного события.
Пусть целое число m – число событий в
теперь куча. Начнем с m = 0. Мы будем
всегда имеют m <= n. В случае после
выделяя наш массив из n компонентов, мы
узнайте, что у нас больше событий для хранения
чем n, мы модифицируем этот первый класс
решение для решения второго класса
ниже.
В куче компоненты должны иметь
“заказать” на основе “ключа”. В нашей куче,
клавишами являются часы на стенах
событий.
Чтобы проверить, для положительного целого я = 1, 2,
…, m, для элемента массива x (i), пусть
k (x (i)) – значение этого компонента
ключ. Затем (возрастающая) куча
условие ‘для я = 2, 3,…, m и
позволяя i/2 быть целой частью этого
фактор,
k (x (i/2)) < к (х (I))
Итак, куча на самом деле не сортируется, а
умный и “неявный” способ хранения двухсторонней
разветвленное дерево.
Есть две операции “кучи”, более быстрая
один и более медленный, используемый для установления
условие кучи. Более быстрая работа
принимает кучу m < n компонентов и новый
event, помещает событие в компонент x (m +
1), рассматривает условие кучи для я = m
+ 1 и обмениваться, если необходимо, и т.д., И
наконец, устанавливает m = m + 1. Чем медленнее
операция имеет кучу m компонентов, для
некоторые я = 1, 2,…, m – 1, удаляет
событие в компоненте x (i) и работает
событие в x (i) и установить кучу m
– 1 компонент. Подробнее см.
текст по алгоритмам и структурам данных,
например, Knuth ‘Искусство компьютера
Программирование: Сортировка и поиск “или
просто детализируйте детали как упражнение.
Мы хотим, чтобы наша куча была “восходящей”
порядок во времени, т.е. так, что x (1) имеет
событие с самым ранним
общим и удобным, мы предполагаем, что наши
компьютерные часы имеют достаточно “разрешения”
что каждое событие может быть уникальным; в виде
ниже, каждый раз уникальный
удаление событий до того, как их действия
были приняты в случае, если мы хотим это сделать).
Предположим, что мы получили событие:
Если время этого события раньше, чем
текущее время, то мы просто вызываем
действия этого события. Да, для некоторых
приложений, которые мы, возможно, захотим изменить
шаг, если мы ожидаем некоторых случаев событий
прибывая быстрее, чем мы можем
действия; Я обсуждаю этот пункт ниже.
Иначе мы помещаем событие в компонент m + 1
массива и выполнить (быстрее) один
двух классических операций кучи до
снова установите условие кучи.
Если теперь m = 1, то мы спрашиваем операционную систему
услуги для прерывания на момент
событие в массиве x (1).
Если m > 1 и установление кучи
условие снова изменило время
событие в массиве x (1), то мы
отменить службы операционной системы
прерывания и попросить прерывание на
время для события теперь в x (1).
Когда мы получаем прерывание, мы берем
действие события в массиве
x (1) и задайте m = m – 1. Теперь массив
компонента x (1) не имеет события и является
“Пустой”. Итак, нам нужно исправить
“пустой” компонент x (1) и, в частности,
снова установить условие кучи. к
этот конец, если m > 0, то мы используем (
медленнее) одна из двух операций кучи
и затем обратитесь к службам операционной системы
для прерывания во время события
теперь в компоненте массива x (1).
Мы можем поддержать отмену события:
время (опять же, каждый раз уникально)
событие, используя тот факт, что куча
действительно хранит двоичное дерево, находит
событие в куче, удалите его и
снова установите условие кучи.
(3) Связанное приложение
Предположим, что мы получаем 2 миллиарда чисел один
в то время и в конце хотят иметь
20 наименьший. Или, если мы хотим, чтобы 20
самый большой, тогда мы используем восходящую кучу.
(4) Решение второго ранга
Если мы обнаружим, что n слишком мало, то
мы рассматриваем кучу выше как “лист”.
Тогда для некоторого натурального k строим
сбалансированное дерево k-way, в котором листья
n кучей компонентов, как указано выше, и узлов
представляют собой k-компонентные кучи, которые указывают на узлы
или листья в дереве дальше от корня
дерева.
Когда нам нужно больше узлов или листьев в
дерево, мы выделяем хранилище. Как обычно, мы
может выбрать положительное целое число р и
на самом деле никогда бесплатно node кучи на меньшее
чем p, и выберите положительное целое q и
на самом деле никогда не освобождает хранилище листьев до
чем q. Таким образом, мы можем “сгладить”,
количество размещения хранилища или бесплатно
запросы к распределению динамического хранилища
менеджер.
Да, здесь мы можем сделать некоторую оптимизацию
математика, начиная с затрат на хранение
распределения и освобождения, а некоторые
предположения о “стохастическом прибытии”
процесса “событий. Благодаря знаменитому
теорема о возобновлении в стохастической точке
процессов, можно предположить, что
процесс прибытия – это нестационарный
Пуассоновский процесс с медленно меняющимся
скорость прибытия.
(5) Деталь с трудом занята
Возможно, иногда приходят события
быстрее, чем мы можем принять их действия.
Итак, в 10:02 мы можем иметь 8 022 события
которые прибыли, но для которых мы имеем
не предпринимал никаких действий и
события раньше времени 10:02.
Что теперь? Ну, мы все равно можем
выполнить события в порядке возрастания по
время. Итак, мы можем пойти и поставить
события в кучу и/или сбалансированное дерево
хранения до тех пор, пока они не “пойманы”, а затем
предпринимать действия в порядке возрастания
время.
(6) Проблема: как модифицировать для многих
сердечники?