如何使用超时进行异步调用

时间:2013-06-03 07:04:00

标签: c++ asynchronous timeout boost-asio

我想在C ++中使用超时进行异步调用,这意味着我想要实现这样的目标。

AsynchronousCall(function, time);
if(success)
    //call finished succesfully
else
    //function was not finished because of timeout

编辑:函数是一种花费大量时间的方法,我想在花费太多时间时打断它。 我一直在寻找如何实现它,我认为boost::asio::deadline_timer是可行的。我想调用timer.async_wait(boost::bind(&A::fun, this, args))是我需要的,但我不知道如何查找调用是否成功或因超时而中止。

编辑:在ForEveR的答案之后,我的代码现在看起来像这样。

    boost::asio::io_service service;
boost::asio::deadline_timer timer(service);
timer.expires_from_now(boost::posix_time::seconds(5));
timer.async_wait(boost::bind(&A::CheckTimer, this, boost::asio::placeholders::error));
boost::thread bt(&A::AsynchronousMethod, this, timer, args);  //asynchronous launch

void A::CheckTimer(const boost::system::error_code& error)
{
if (error != boost::asio::error::operation_aborted)
{
    cout<<"ok"<<endl;
}
// timer is cancelled.
else
{
    cout<<"error"<<endl;
}
}

我想通过引用传递计时器并在异步方法结束时取消它,但是我得到一个错误,我无法访问在class :: boost :: asio :: basic_io_object中声明的私有成员。

也许使用截止时间计时器不是一个好主意?我真的很感激任何帮助。我正在将计时器传递给函数,因为调用异步方法的方法本身是异步的,因此我不能为整个类提供一个计时器或者像那样。

1 个答案:

答案 0 :(得分:0)

您应该使用boost::asio::placeholders::error

timer.async_wait(boost::bind(
&A::fun, this, boost::asio::placeholders::error));

A::fun(const boost::system::error_code& error)
{
   // timeout, or some other shit happens
   if (error != boost::asio::error::operation_aborted)
   {
   }
   // timer is cancelled.
   else
   {
   }
}