C++ C++;:asio:在同一函数中等待异步处理程序

C++ C++;:asio:在同一函数中等待异步处理程序,c++,asynchronous,boost,boost-asio,C++,Asynchronous,Boost,Boost Asio,在boost::asio中,从示例开始,是否可以在同一函数中等待处理程序?比如: void myFunc() { int time = 0; socket_.async_handshake(boost::asio::ssl::stream_base::client, boost::bind(&SSLClient::handle_handshake, this,

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*/);});


您可能需要注意p的有效性,因为如果p的作用域是函数,并且您在不等待任何响应的情况下脱离了循环,那么lambda可能已经被调用,并且p可能在离开函数后使用。

我不明白。你想同步使用异步调用吗?@LightnessRacesinOrbit也许这是一种表述方式。。。我只需要响应发生在同一个函数中。你可以,使用lambda函数,或者协程。@TheQuantumPhysicator:我认为这没有任何意义。您确定正确理解了Qt约束吗?甚至还包含一个从
SomeThread::run()
中长时间运行和阻塞函数调用的示例。我认为这可能不是问题……有没有任何理由可以解释为什么人们更喜欢这种方法而不是使用Boost.Asio?
while(1)
{
    auto status = f.wait_for(std::chrono::seconds(1));
    if (status == future_status::ready)
    {
        break;
    }
}