0

C ++でタイムアウトを使用して非同期呼び出しを行いたい、つまり、そのようなsthを実現したい。

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

EDIT :関数は時間がかかるメソッドであり、時間がかかりすぎるときに中断したい。私はそれを達成する方法を探していましたが、それ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;
}
}

タイマーを参照渡しし、非同期メソッドの最後でキャンセルしたかったのですが、クラス ::boost::asio::basic_io_object で宣言されたプライベートメンバーにアクセスできないというエラーが発生しました。

たぶん、締め切りタイマーを使用するのはあまり良い考えではありませんか? 助けていただければ幸いです。非同期メソッドを呼び出すメソッド自体が非同期であるため、タイマーを関数に渡しています。したがって、クラス全体またはそのような sth に対して 1 つのタイマーを使用することはできません。

4

1 に答える 1

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
   {
   }
}
于 2013-06-03T07:12:17.960 に答える