虚拟ASIO服务回调?

时间:2014-08-14 18:41:42

标签: c++ boost asynchronous boost-asio

我有一个基于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()的回调?

1 个答案:

答案 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()

获取