LINUX.ORG.RU

Класс таймер срабатывающего каждые N секунд.

 , , ,


1

2

Мне нужен класс таймера (будильника?) который срабатывает каждые N секунд. В описании ASIO я нашёл таймеры, которые разово срабатывают через указанный промежуток времени.

Boost/ASIO/Timers

Можно, конечно, просто передёргивать их каждый раз, но тогда промежуток времени получиться чуточку больше. Мне, конечно, это некритично, просто хочу увидеть менее костыльное решение. Таймеры из Gtk+ и Qt, будэ таковые имеются, не подходят, потому что тянут за собой Gtk+ и Qt, нужно что-то более компактное.

Может я вообще не те слова ищу в описании? Может это по-английски не timer называется, а как-то по-другому?

★★★★★

А что мешает задавать абсолютное время срабатывания, чтобы не получалось «чуточку больше»

ratatosk ()

Все правильно, получаешь событие, устанавливаешь новое время срабатывания. Таймеры gtk и qt, кстати отсчитывают время от срабатывания, а не от начала плюс интервал умноженный на количество срабатываний плюс один. Можно здесь как раз так и сделать, проверяя, не находится ли это время в прошлом.

note173 ★★★★★ ()
Ответ на: комментарий от ratatosk

Что мешает.

А что мешает задавать абсолютное время срабатывания, чтобы не получалось «чуточку больше»

Желание найти готовое менее костыльное решение. Вот в Arduino, например, таймер примерно такой как мне нужно.

Timer1.initialize(TICK_PERIOD);   // tick period в микросекундах
Timer1.attachInterrupt(callback); // callback -- функция, которая дёргается таймером

Camel ★★★★★ ()
Ответ на: комментарий от mopsene

Может нужны.

Может тебе нужны потоки?

Чур меня. То есть я хотел сказать, что может и нужны, только я надеюсь, что класс предоставит мне достаточно высокий уровень абстракции.

Camel ★★★★★ ()
Ответ на: комментарий от note173

Так и сделаю.

Все правильно, получаешь событие, устанавливаешь новое время срабатывания. Таймеры gtk и qt, кстати отсчитывают время от срабатывания, а не от начала плюс интервал умноженный на количество срабатываний плюс один. Можно здесь как раз так и сделать, проверяя, не находится ли это время в прошлом.

Ну, значит так и буду делать пока. На ASIO Timer'е конечно.

Camel ★★★★★ ()

Настоящие таймеры, на которые можно полагаться и быть уверенным за точное время срабатывания могут быть только на RTOS.

mono ★★★★★ ()
Ответ на: Что мешает. от Camel

Кстати, можно отталкиваться от предыдущего времени срабатывания, когда заряжаешь следующее:

timer->expires_at(timer->expires_at() + period);

ratatosk ()

Как на счёт libev? Эта библиотека может создать main loop и вешать события на разные действия. Что-то вроде

#include <ev.h> // ev++.h
#include <stdio.h>

ev_periodic periodic;
int count;

static void
timeout_cb (EV_P_ ev_periodic *w, int revents)
{
  printf ("timeout %d\n", count);
  if (count ++ > 3)  // this causes the innermost ev_run to stop iterating
    ev_break (EV_A_ EVBREAK_ONE);
}

int
main (void)
{
  struct ev_loop *loop = EV_DEFAULT;
  count = 0;

  // call timeout_cb every 5 seconds start from now
  ev_periodic_init (&periodic, timeout_cb, ev_now (loop), 5.0, NULL);
  ev_periodic_start (loop, &periodic);

  // start main loop
  ev_run (loop, 0);

  // break was called
  return 0;
}
kim-roader ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.