Вызов функции по времени - PullRequest
       1

Вызов функции по времени

2 голосов
/ 07 декабря 2010

Я программирую на C ++, в среде Linux. Как я могу вызвать функцию после определенного интервала асинхронно, а также через регулярный интервал? Я обнаружил Boost timer в http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/tutorial/tuttimer2.html. Однако для вызова обратного вызова необходимо вызвать io.run (), что, в свою очередь, возвращает меня к первоначальной проблеме: мне нужно позаботиться о прошедшем времени для вызова функция. Мне нужно что-то вроде C # System.Threading.Timer, который будет вызывать функцию, которую я передал после указанного периода времени.

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

Спасибо.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

asio io_service запускается в своем собственном потоке, как только вы планируете событие таймера, он перезвонит вам в соответствующее время.

Вот полный пример:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

using namespace std;

class timed_class
{
public:
  timed_class(boost::asio::io_service& io_service) : _timer(io_service)
  {
    // now schedule the first timer.

    _timer.expires_from_now(boost::posix_time::milliseconds(100)); // runs every 100 ms
    _timer.async_wait(boost::bind(&timed_class::handle_timeout, this, boost::asio::placeholders::error));
  }

  void handle_timeout(boost::system::error_code const& cError)
  {
    if (cError.value() == boost::asio::error::operation_aborted)
      return;

    if (cError && cError.value() != boost::asio::error::operation_aborted)
      return; // throw an exception?

    cout << "timer expired" << endl;

    // Schedule the timer again...
    _timer.expires_from_now(boost::posix_time::milliseconds(100)); // runs every 100 ms
    _timer.async_wait(boost::bind(&timed_class::handle_timeout, this, boost::asio::placeholders::error));
  }

private:
  boost::asio::deadline_timer _timer;
};


int main(void)
{
  boost::asio::io_service io_service;

  timed_class t(io_service);

  io_service.run();

  return 0;
}

РЕДАКТИРОВАТЬ: для отправки в отдельном потоке,

boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

Вместо io_service.run();, теперь основной поток будет продолжаться и по истечении времени ожидания, тогда io_serviceпозвонит handle_timeout

1 голос
/ 07 декабря 2010

Псевдокод для простейшего решения:

function doThis() {
    // your code here
}

function threadHandler() {
    sleep(SecondsUntilTime);
    doThis();
}

function main () {
    anotherthread = thread_create(threadHandler);

    // more code here

    join(anotherthread);
    exit();
}
0 голосов
/ 07 декабря 2010

Один из вариантов - переключиться на glib - или Qt для их цикла событий и написать свой код, используя это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...