Я хочу сделать асинхронный вызов в C++ с тайм-аутом, что означает, что я хочу достичь этого.Как сделать асинхронный вызов с тайм-аутом
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))
- это то, что мне нужно, но я не знаю, как найти, был ли вызов успешным или был прерван из-за таймаута.
EDIT: после ответа от 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;
}
}
Я хотел передать таймер по ссылке, и отменить его в конце асинхронного метода, но я получил сообщение об ошибке, что я не могу получить доступ к закрытому члену, объявленному в классе :: увеличить :: ASIO :: basic_io_object.
Возможно, использование таймера с таймером - это не очень хорошая идея? Я бы очень признателен за любую помощь. Я передаю таймер функции, потому что метод, который вызывает асинхронный метод, сам асинхронен, и поэтому у меня не может быть одного таймера для всего класса или подобного.
Я включил повышение/ASIO/placeholders.hpp и до сих пор я не могу найти подталкивание :: ASIO :: PLACEHOLDERS :: об ошибке:/также главное задание на 'функции fun' должен ли быть в начале функции? – rank1
@ cygi1989 ehm ... fun - это просто обратный вызов таймера. Какую работу он делает, независимо от ошибок? Если вы не можете найти placeholders :: error, попробуйте просто _1. – ForEveR
Итак, возможно, я пропустил использование deadline_timer. Я хочу вызвать функцию A :: fun асинхронно. Эта функция выполняет большую работу, и я хочу прервать эту функцию, если она занимает слишком много времени. – rank1