C++:Boost::asio:等待同一函数中的异步处理程序
C++: Boost::asio: Wait for asynchronous handler in the same function
在boost::asio
中,从this示例开始,是否可以在同一个函数中等待处理程序?所以像:
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可能被使用离开功能后。
在boost::asio
中,从this示例开始,是否可以在同一个函数中等待处理程序?所以像:
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可能被使用离开功能后。