2013-06-03 2 views
0

Я хочу сделать асинхронный вызов в 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.

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

ответ

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 
    { 
    } 
} 
+0

Я включил повышение/ASIO/placeholders.hpp и до сих пор я не могу найти подталкивание :: ASIO :: PLACEHOLDERS :: об ошибке:/также главное задание на 'функции fun' должен ли быть в начале функции? – rank1

+0

@ cygi1989 ehm ... fun - это просто обратный вызов таймера. Какую работу он делает, независимо от ошибок? Если вы не можете найти placeholders :: error, попробуйте просто _1. – ForEveR

+0

Итак, возможно, я пропустил использование deadline_timer. Я хочу вызвать функцию A :: fun асинхронно. Эта функция выполняет большую работу, и я хочу прервать эту функцию, если она занимает слишком много времени. – rank1

Смежные вопросы