定时函数调用

Ash*_*ley 2 c++ linux

我在C++,Linux环境下编程.如何以异步方式和定期间隔在一定时间间隔后调用函数?我在http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/tutorial/tuttimer2.html找到了Boost计时器.但是,它需要调用io.run()来调用回调,这反过来又让我回到原来的问题,即需要我处理调用该函数所用的时间.我需要的是类似C#System.Threading.Timer的东西,它会回调我在指定的时间段之后传递的函数.

我正在考虑为每个函数调用创建一个线程.但是,我有相当多的这种计时器回调.因此,我担心创建这样的线程会很昂贵,还是我有其他选择呢?

谢谢.

Nim*_*Nim 5

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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:在一个单独的线程中发送,

boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
Run Code Online (Sandbox Code Playgroud)

而不是io_service.run();,现在主线程将继续,并且一旦超时到期,那么io_service将调用handle_timeout