LINUX.ORG.RU

timer [C++]

 


0

0

Здравствуйте, как создать таймер? Нужен такой таймер, чтоб он вызывал периодически какую нибудь функцию.

Я знаю способ с функцией timer_create, но мне нужен способ вызывать не простую функцию, а функцию-член какого ниудь класса.

Что можете посоветовать?


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

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

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

void timer_proc(int signo, siginfo_t *info, void *context)
{

}

  timer_t tm_id;
  struct sigevent sigev;
  struct itimerspec itval;
  struct sigaction sigact;
  struct itimerspec oitval;

  sigemptyset(&sigact.sa_mask);
  sigact.sa_flags = SA_SIGINFO;
  sigact.sa_sigaction = timer_proc;

  sigev.sigev_value.sival_ptr = NULL;
  sigev.sigev_notify = SIGEV_SIGNAL;
  sigev.sigev_signo = SIGRTMAX;
  sigev.sigev_value.sival_ptr = &tm_id;

  if (timer_create(CLOCK_REALTIME, &sigev, &tm_id) == 0)
  {
    itval.it_value.tv_sec = itval.it_interval.tv_sec = (60 * 30);
    itval.it_value.tv_nsec = itval.it_interval.tv_nsec = 0;
    if (timer_settime(tm_id,0,&itval,&oitval) != 0)
    {
      fprintf(stderr,"Error: Unable set timer\n");
      timer_delete(tm_id);
      return 1;
    }
  } else {
    fprintf(stderr,"Error: Unable create timer\n");
    return 1;
  }

Если это поможет решению вопроса, то скажу, что есть у меня в программе бесконечный цикл получения сообщений от X11-сервера

xmM
() автор топика
Ответ на: комментарий от hibou

Спасибо hibou, уже научился успешно использовать таймеры glib

xmM
() автор топика
Ответ на: комментарий от anonymous

> В чем проблема через context передавать this?

Всё верно, так и нужно делать. Ну раз уж топикстартер осилил GTK...

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

Если это поможет решению вопроса, то скажу, что есть у меня в программе бесконечный цикл получения сообщений от X11-сервера

Про передачу указателя на экземпляр класса через context уже сказали. У меня дополнительный вопрос: как связан таймер с циклом получения сообщений от X-сервера? Или ты просто одновременно с получением сообщений хочешь что-то делать через равные промежутки времени?

Deleted
()

как то так можно, если используется asio:
Foo foo;
boost::asio::deadline_timer + timer(io_service,
boost::posix_time::time_from_string("2005-12-07 23:59:59.000"));
timer.async_wait(boost::bind(&Foo::Bar, &foo));

stpg
()
Ответ на: комментарий от ott

> В чем проблема через context передавать this?

я не знал, что context может быть равен чему угодно.

>Или ты просто одновременно с получением сообщений хочешь что-то делать через равные промежутки времени?

да, так оно и есть.

xmM
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.