繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM