[英]C++: Boost::asio: Wait for asynchronous handler in the same function
在boost::asio
,从本示例开始,是否可以在同一函数中等待处理程序? 所以像这样:
void myFunc()
{
int time = 0;
socket_.async_handshake(boost::asio::ssl::stream_base::client,
boost::bind(&SSLClient::handle_handshake, this,
boost::asio::placeholders::error));
while(1)
{
//hypothetical condition that will become true when async_handshake has finished
if(handshake_finished)
{
//do something
break;
}
if(time > timeout)
{
socket_.cancel();
break;
}
sleep(1);
time++;
}
}
因此,我希望能够使用异步调用而不必编写新函数来执行下一步操作。
为什么我需要这样做? 因为我使用的是QThread,所以与新线程相关的所有东西都必须放在单个函数QThread::run()
,并且在函数结尾必须执行Qt的事件循环。
您需要某种同步,并且处理程序函数具有静态原型,我想说您可能需要将该同步封装在一个函数中,例如,这可能是lambda。 对于同步,使用期货可能是一个可行的想法。 如果您有一对promise p和future f,这可以归结为:
socket_.async_handshake(boost::asio::ssl::stream_base::client,
[&p](/* insert args */){ p.set_value(/*value*/);});
和
while(1)
{
auto status = f.wait_for(std::chrono::seconds(1));
if (status == future_status::ready)
{
break;
}
}
您可能需要注意p的有效性,好像p的作用域是函数并且您正在退出循环而没有等待任何响应,lambda可能已经被调用,并且p可能在离开函数后使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.