gpt4 book ai didi

c++ - 虚拟 ASIO 服务回调?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:19 26 4
gpt4 key购买 nike

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

我有一个接口(interface)函数需要支持客户端代码,但最近我的实现发生了变化,这个接口(interface)函数不再做任何事情。

void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( 
boost::function< void( int ) > callback );

接口(interface)的客户端代码在调用后的某个时间期待回调。以前,实现可能类似于:

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() 上出现?

最佳答案

Is there a more elegant way of getting the callback to come on io_service::run() other than using a zero-timer?

当然,这是:

void MyClass::FuncThatNoLongerDoesAnythingButMustBeSupported( 
boost::function< void( int ) > callback )
{
io.post( boost::bind(callback, 0) );
}

如果您没有io_service 引用,您可以从m_zero_timer.get_io_service()获取它

关于c++ - 虚拟 ASIO 服务回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com