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

时间:2015-08-14 10:30:56

标签: c++ asynchronous boost boost-asio

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的事件循环。

1 个答案:

答案 0 :(得分:0)

你需要某种同步,并且由于处理函数有一个静态原型,我想你可能需要在函数中封装该同步,例如,这可能是一个lambda。对于同步,使用期货可能是一个可行的想法。如果您有一对承诺p和未来的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可能在离开后使用功能。