我有一个基于ASIO的对象进行网络通信,我需要做一个小修复,但它涉及向ASIO io_service添加虚拟请求和回调。
我有一个接口函数,我需要支持客户端代码,但最近我的实现发生了变化,这个接口函数不再做任何事情。
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported(
boost::function< void( int ) > callback );
接口的客户端代码在进行调用后的某个时间需要回调。以前,实现可能看起来像:
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported(
boost::function< void( int ) > callback )
{
boost::asio::async_write(m_socket_previously_connected,
m_request_buf_previously_filled,
boost::bind( &MyClass::HandleAsyncWriteCompletion,
this,
boost::asio::placeholders::error,
callback ) );
}
void MyClass::HandleAsyncWriteCompletion(
const boost::system::error_code& e,
boost::function< void( int ) > originalCallback )
{
if(!e) // Write operation completed successfully
{
orignalCallback( 0 );
}
else
{
orignalCallback( -1 );
}
}
现在,MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported
什么都不做,但客户仍然希望它在那里并继续调用它。我能做到这一点:
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported(
boost::function< void( int ) > callback )
{
callback( 0 );
}
...但这有点危险,因为客户端将在意外时间 - 在调用MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported
期间收到回调。我想做的是:
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported(
boost::function< void( int ) > callback )
{
// Set the timeout and asynchronously wait
m_zero_timer.expires_from_now(boost::posix_time::seconds(0));
m_zero_timer.async_wait(boost::bind(&MyClass::ZeroTimerExpiry,
this,
boost::asio::placeholders::error,
callback ) );
}
void MyClass::ZeroTimerExpiry( const boost::system::error_code & e,
boost::function< void( int ) > orignalCallback )
{
orignalCallback( 0 );
}
除了使用零定时器之外,是否有一种更优雅的方式来获得io_service :: run()的回调?
答案 0 :(得分:2)
除了使用零定时器之外,是否有一种更优雅的方法可以使io_service :: run()获得回调?
当然,这是:
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported(
boost::function< void( int ) > callback )
{
io.post( boost::bind(callback, 0) );
}
如果您没有io_service
引用,可以从m_zero_timer.get_io_service()