как создать точный период запуска функции? (как запускать фунцию с определенным периодом, не зависимо от времени е)
Модератор: Модераторы разделов
-
Seven
- Сообщения: 88
- ОС: Fedora 11, openSUSE 11.2
как создать точный период запуска функции?
В виндах есть функции CreateTimerQueue() и CreateTimerQueueTimer которые запускают заданную функцию с определенным периодом. Понятно что функция должна иметь маленький (а точнее быстроисполняемый код)... а как это сделать в линуксе??
период должен быть меньше секунды (а вообще какой самый маленький период таймеров).
Вся загвоздка в том, что какой код будет исполняться на стадии проектирования не известно, т.е. зависит от конфига программы. и поэтому select не подойдет... мож кто знает другой путь?
период должен быть меньше секунды (а вообще какой самый маленький период таймеров).
Вся загвоздка в том, что какой код будет исполняться на стадии проектирования не известно, т.е. зависит от конфига программы. и поэтому select не подойдет... мож кто знает другой путь?
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: как создать точный период запуска функции?
Seven писал(а): ↑31.10.2005 09:11В виндах есть функции CreateTimerQueue() и CreateTimerQueueTimer которые запускают заданную функцию с определенным периодом. Понятно что функция должна иметь маленький (а точнее быстроисполняемый код)... а как это сделать в линуксе??
период должен быть меньше секунды (а вообще какой самый маленький период таймеров).
Вся загвоздка в том, что какой код будет исполняться на стадии проектирования не известно, т.е. зависит от конфига программы. и поэтому select не подойдет... мож кто знает другой путь?
man setitimer
В каждом из нас спит гений... и с каждым днем все крепче...
-
Seven
- Сообщения: 88
- ОС: Fedora 11, openSUSE 11.2
-
powerfox
- Сообщения: 458
Re: как создать точный период запуска функции?
У меня нет мануала к setitimer. Из того, что нашёл в нете неясно, как использовать(где задавать имя, запускаемой ф-ии)
Кто чем поможет - спасибо
Кто чем поможет - спасибо
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
-
Nab
- Сообщения: 257
-
powerfox
- Сообщения: 458
Re: как создать точный период запуска функции?
До того, как спросить, посмотрел - ничего понятного не нашёл.
Спасибо, видел то же самое на английском - а где задавать имя вызываемой ф-ии?
-
Nab
- Сообщения: 257
Re: как создать точный период запуска функции?
Я даже теряюсь что Вам ответить 
-
powerfox
- Сообщения: 458
Re: как создать точный период запуска функции?
Нашёл на forum.vingrad.ru похожую ветку - ответили
На opennet почитал доки:
signal
список сигналов
alarm - генерирует SIGALRM
setitimer - генерирует сигналы
По чуть-чуть начинаю въезжать
-
Seven
- Сообщения: 88
- ОС: Fedora 11, openSUSE 11.2
Re: как создать точный период запуска функции?
По чуть-чуть начинаю въезжать![]()
![]()
Тут народ чаще на вопрос посылают..... на гугль...
Я думаю что гугль это первое где надо смотреть если вдруг возникает вопрос (единственно что чел может не корректно создать запрос в поисковике)... но если он обратился сюда, думаю не стоит труда как то попытаться помочь, мож просто поясьнить и объяснить.
Я не гуру в Linuxе, но я делал так:
Фнкция обработки сигнала (которая вызывается по таймеру):
Код: Выделить всё
void fsignal (int sig)
{
case SIGALRM:
//обработка сигнала по таймеру
break;
case SIGTERM:
//тоже желательно обрабатывать сигнал Linuxа о терминировании (или как правильно
}сказать системе какую именно функцию вызывать по сигналу таймера:
Код: Выделить всё
signal(SIGALRM, fsignal);//по таймеру
signal(SIGTERM, fsignal);//принудительное завершениену и задание самого таймера
Код: Выделить всё
setitimer(ITIMER_REAL, &newset, &origset);в место ITIMER_REAL можно использовать другие ключи, в зависимости от задачи.
newset и origset переменные типа itimerval, к оторых задается время таймера. У меня нормальный результат получился при одинаковых значениях в этих двух переменных:
newset.it_interval.tv_sec = секунды;
newset.it_interval.tv_usec = милисекунды * 1000;//тут именно в микросекундах значение
P.S. если я где то не прав, или в чем то напутал, исправления и дополнения специалистами или знающими будет принято во внимание с пребольшим удовольствием.
-
Zeus
- Сообщения: 694
Re: как создать точный период запуска функции?
А вот как подвесить на сигнал функцию из класса?
Статическую - пожалста, но сама по себе она не лучше "простофункции".
Или второй вариант - статическая функция, но ей нужно передать указатель на её класс, а сигналы это не умеют...
Может стОит покопать в сторону виртуальных функций?
Хотя компилер всё-равно не поймёт - таблицы ВФ существуют, наверное, уже только на этапе линковки...
В общем, я в ступоре...
Статическую - пожалста, но сама по себе она не лучше "простофункции".
Или второй вариант - статическая функция, но ей нужно передать указатель на её класс, а сигналы это не умеют...
Может стОит покопать в сторону виртуальных функций?
Хотя компилер всё-равно не поймёт - таблицы ВФ существуют, наверное, уже только на этапе линковки...
В общем, я в ступоре...
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: как создать точный период запуска функции?
Zeus, сделай статическую функцию, которая будет возвращать указатель на объект, и статический обработчик сигналов, который будет получать объект от этой функции.... так можно реализовать любую логику. вплоть до того, что один и тот же обработчик будет обрабатывать разные сигналы в контексте разных объектов....
слава роботам!
-
Zeus
- Сообщения: 694
Re: как создать точный период запуска функции?
Что-то недопонял:
1. приходит сигнал (например от таймера)
2. в качестве обработчика вызывается статическая функция класса С++.
Как она узнает для какого объекта она вызвана?
Пояснения: объект класса уже создан и нужно чтобы ОН обрабатывал сигналы. Не просто КАКОЙ-ТО объект класса, а ИМЕННО ЭТОТ!
1. приходит сигнал (например от таймера)
2. в качестве обработчика вызывается статическая функция класса С++.
Как она узнает для какого объекта она вызвана?
Пояснения: объект класса уже создан и нужно чтобы ОН обрабатывал сигналы. Не просто КАКОЙ-ТО объект класса, а ИМЕННО ЭТОТ!
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: как создать точный период запуска функции?
Zeus писал(а): ↑25.11.2005 14:24А вот как подвесить на сигнал функцию из класса?
Статическую - пожалста, но сама по себе она не лучше "простофункции".
Или второй вариант - статическая функция, но ей нужно передать указатель на её класс, а сигналы это не умеют...
Может стОит покопать в сторону виртуальных функций?
Хотя компилер всё-равно не поймёт - таблицы ВФ существуют, наверное, уже только на этапе линковки...
В общем, я в ступоре...
Хрен скрестишь, хотя brain-damaged конструкции помогают. Есть книжка Джефа Элджера про такие извращения. По причине слабости к сверхсильным нервным перенапряжениям я их не запомнил
В каждом из нас спит гений... и с каждым днем все крепче...
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: как создать точный период запуска функции?
ну так зарегистрируй его.
создай в классе статический массив указателей, потом выбирай оттуда по номеру сигнала указатель на нужный объект....
типа SignalHandler::addSignalListener(SIGALRM, ptrToSignalHandlerInstance); будет делать listeners[signal] = ptrToSignalHandlerInstance;
а потом обработчик сигнала будет делать listeners[signal]->handleSignal(signal);
создай в классе статический массив указателей, потом выбирай оттуда по номеру сигнала указатель на нужный объект....
типа SignalHandler::addSignalListener(SIGALRM, ptrToSignalHandlerInstance); будет делать listeners[signal] = ptrToSignalHandlerInstance;
а потом обработчик сигнала будет делать listeners[signal]->handleSignal(signal);
слава роботам!
-
Zeus
- Сообщения: 694
Re: как создать точный период запуска функции?
Хм.
Надо подумать, поэкспериментировать... Может и покатит...
Хотя тогда, млин, можно и глобальную переменную-указатель (ну или массив - как угодно) создать.
Единственное что в классе их закрыть можно, а по сути - один фиг получается.
Надо подумать, поэкспериментировать... Может и покатит...
Хотя тогда, млин, можно и глобальную переменную-указатель (ну или массив - как угодно) создать.
Единственное что в классе их закрыть можно, а по сути - один фиг получается.
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: как создать точный период запуска функции?
глобальную - неправильно.
а еще можно вместо массива - map из векторов (:
тогда на один сигнал можно будет вешать несколько обработчиков....
а можно написать обертку вокруг сигналов вообще, а потом к ней цеплять listeners, как в java.
вариантов - десятки, а по сути.... по сути оно все один
...
а еще можно вместо массива - map из векторов (:
тогда на один сигнал можно будет вешать несколько обработчиков....
а можно написать обертку вокруг сигналов вообще, а потом к ней цеплять listeners, как в java.
вариантов - десятки, а по сути.... по сути оно все один
слава роботам!