Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 虚拟ASIO服务回调?_C++_Boost_Asynchronous_Boost Asio - Fatal编程技术网

C++ 虚拟ASIO服务回调?

C++ 虚拟ASIO服务回调?,c++,boost,asynchronous,boost-asio,C++,Boost,Asynchronous,Boost Asio,我有一个基于ASIO的对象进行网络通信,我需要做一个小的修复,但它涉及到向ASIO io_服务添加一个虚拟请求和回调 我有一个接口函数,我需要为客户机代码提供支持,但随着我的实现最近的变化,这个接口函数不再起任何作用 void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( boost::function< void( int ) > callback ); …但这有点危险,因为客户端将在一个意外的时间获得

我有一个基于ASIO的对象进行网络通信,我需要做一个小的修复,但它涉及到向ASIO io_服务添加一个虚拟请求和回调

我有一个接口函数,我需要为客户机代码提供支持,但随着我的实现最近的变化,这个接口函数不再起任何作用

void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( 
    boost::function< void( int ) > callback );
…但这有点危险,因为客户端将在一个意外的时间获得回调—在调用
MyClass::function期间,它不再做任何事情,但必须支持
。我想做的是:

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 );
    }    
}
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 );
}
void MyClass::函数不再支持任何内容,但必须支持(
boost::函数回调)
{
//设置超时并异步等待
m_zero_timer.expires_from_now(boost::posix_time::seconds(0));
m_zero_timer.async_wait(boost::bind(&MyClass::ZeroTimerExpiry,
这
boost::asio::占位符::错误,
回调);
}
void MyClass::ZeroTimerExpiry(const boost::system::error_code&e,
boost::函数orignalCallback)
{
原始回缩(0);
}
除了使用零计时器,还有没有更优雅的方法让回调在io_service::run()上运行

除了使用零计时器,还有没有更优雅的方法让回调在io_service::run()上运行

当然可以,给你:

void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( 
    boost::function< void( int ) > callback )
{
    io.post( boost::bind(callback, 0) );
}
void MyClass::函数不再支持任何内容,但必须支持(
boost::函数回调)
{
io.post(boost::bind(回调,0));
}
如果您没有
io\u服务
引用,您可以从
m\u zero\u计时器获取它。获取io\u服务()

也许您正在寻找?
post()
将确保您的客户端以与此更改之前相同的方式(在相同的线程内)获取回调。
void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( 
    boost::function< void( int ) > callback )
{
    io.post( boost::bind(callback, 0) );
}