как создать точный период запуска функции? (как запускать фунцию с определенным периодом, не зависимо от времени е)

Модератор: Модераторы разделов

Аватара пользователя
Seven
Сообщения: 88
ОС: Fedora 11, openSUSE 11.2

как создать точный период запуска функции?

Сообщение Seven »

В виндах есть функции CreateTimerQueue() и CreateTimerQueueTimer которые запускают заданную функцию с определенным периодом. Понятно что функция должна иметь маленький (а точнее быстроисполняемый код)... а как это сделать в линуксе??
период должен быть меньше секунды (а вообще какой самый маленький период таймеров).
Вся загвоздка в том, что какой код будет исполняться на стадии проектирования не известно, т.е. зависит от конфига программы. и поэтому select не подойдет... мож кто знает другой путь?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: как создать точный период запуска функции?

Сообщение flook »

Seven писал(а):
31.10.2005 09:11
В виндах есть функции CreateTimerQueue() и CreateTimerQueueTimer которые запускают заданную функцию с определенным периодом. Понятно что функция должна иметь маленький (а точнее быстроисполняемый код)... а как это сделать в линуксе??
период должен быть меньше секунды (а вообще какой самый маленький период таймеров).
Вся загвоздка в том, что какой код будет исполняться на стадии проектирования не известно, т.е. зависит от конфига программы. и поэтому select не подойдет... мож кто знает другой путь?


man setitimer
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
Seven
Сообщения: 88
ОС: Fedora 11, openSUSE 11.2

Re: как создать точный период запуска функции?

Сообщение Seven »

flook писал(а):
31.10.2005 09:30
man setitimer

Спасибо. то что надо!!!...
самое обидное что я это уже использовал давно.... но забыл...
вот что значит давно на линуксе не писал.... надо убирать этот пробол.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: как создать точный период запуска функции?

Сообщение powerfox »

У меня нет мануала к setitimer. Из того, что нашёл в нете неясно, как использовать(где задавать имя, запускаемой ф-ии)
Кто чем поможет - спасибо :rolleyes:
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: как создать точный период запуска функции?

Сообщение elide »

слава роботам!
Спасибо сказали:
Nab
Сообщения: 257

Re: как создать точный период запуска функции?

Сообщение Nab »

Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: как создать точный период запуска функции?

Сообщение powerfox »


До того, как спросить, посмотрел - ничего понятного не нашёл.

Спасибо, видел то же самое на английском - а где задавать имя вызываемой ф-ии?
Спасибо сказали:
Nab
Сообщения: 257

Re: как создать точный период запуска функции?

Сообщение Nab »

Я даже теряюсь что Вам ответить :huh:
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: как создать точный период запуска функции?

Сообщение powerfox »

Nab писал(а):
17.11.2005 22:15
Я даже теряюсь что Вам ответить :huh:

Нашёл на forum.vingrad.ru похожую ветку - ответили

На opennet почитал доки:
signal
список сигналов
alarm - генерирует SIGALRM
setitimer - генерирует сигналы

По чуть-чуть начинаю въезжать :rolleyes: :unsure: :wacko:
Спасибо сказали:
Аватара пользователя
Seven
Сообщения: 88
ОС: Fedora 11, openSUSE 11.2

Re: как создать точный период запуска функции?

Сообщение Seven »

По чуть-чуть начинаю въезжать :rolleyes: :unsure: :wacko:

Тут народ чаще на вопрос посылают..... на гугль...
Я думаю что гугль это первое где надо смотреть если вдруг возникает вопрос (единственно что чел может не корректно создать запрос в поисковике)... но если он обратился сюда, думаю не стоит труда как то попытаться помочь, мож просто поясьнить и объяснить.
Я не гуру в 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: как создать точный период запуска функции?

Сообщение Zeus »

А вот как подвесить на сигнал функцию из класса?
Статическую - пожалста, но сама по себе она не лучше "простофункции".
Или второй вариант - статическая функция, но ей нужно передать указатель на её класс, а сигналы это не умеют...

Может стОит покопать в сторону виртуальных функций?
Хотя компилер всё-равно не поймёт - таблицы ВФ существуют, наверное, уже только на этапе линковки...

В общем, я в ступоре...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: как создать точный период запуска функции?

Сообщение elide »

Zeus, сделай статическую функцию, которая будет возвращать указатель на объект, и статический обработчик сигналов, который будет получать объект от этой функции.... так можно реализовать любую логику. вплоть до того, что один и тот же обработчик будет обрабатывать разные сигналы в контексте разных объектов....
слава роботам!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: как создать точный период запуска функции?

Сообщение Zeus »

Что-то недопонял:
1. приходит сигнал (например от таймера)
2. в качестве обработчика вызывается статическая функция класса С++.
Как она узнает для какого объекта она вызвана?

Пояснения: объект класса уже создан и нужно чтобы ОН обрабатывал сигналы. Не просто КАКОЙ-ТО объект класса, а ИМЕННО ЭТОТ!
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: как создать точный период запуска функции?

Сообщение flook »

Zeus писал(а):
25.11.2005 14:24
А вот как подвесить на сигнал функцию из класса?
Статическую - пожалста, но сама по себе она не лучше "простофункции".
Или второй вариант - статическая функция, но ей нужно передать указатель на её класс, а сигналы это не умеют...

Может стОит покопать в сторону виртуальных функций?
Хотя компилер всё-равно не поймёт - таблицы ВФ существуют, наверное, уже только на этапе линковки...

В общем, я в ступоре...

Хрен скрестишь, хотя brain-damaged конструкции помогают. Есть книжка Джефа Элджера про такие извращения. По причине слабости к сверхсильным нервным перенапряжениям я их не запомнил :)
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: как создать точный период запуска функции?

Сообщение elide »

ну так зарегистрируй его.
создай в классе статический массив указателей, потом выбирай оттуда по номеру сигнала указатель на нужный объект....
типа SignalHandler::addSignalListener(SIGALRM, ptrToSignalHandlerInstance); будет делать listeners[signal] = ptrToSignalHandlerInstance;
а потом обработчик сигнала будет делать listeners[signal]->handleSignal(signal);
слава роботам!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: как создать точный период запуска функции?

Сообщение Zeus »

Хм.
Надо подумать, поэкспериментировать... Может и покатит...
Хотя тогда, млин, можно и глобальную переменную-указатель (ну или массив - как угодно) создать.
Единственное что в классе их закрыть можно, а по сути - один фиг получается.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: как создать точный период запуска функции?

Сообщение elide »

глобальную - неправильно.
а еще можно вместо массива - map из векторов (:
тогда на один сигнал можно будет вешать несколько обработчиков....
а можно написать обертку вокруг сигналов вообще, а потом к ней цеплять listeners, как в java.
вариантов - десятки, а по сути.... по сути оно все один :censored:...
слава роботам!
Спасибо сказали: