C++:Boost::asio:WAITING同一函数中的异步处理程序

标签 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 的事件循环必须被执行。

最佳答案

您需要某种同步,并且由于处理函数具有静态原型(prototype),我想说您可能需要将该同步封装在一个函数中,例如这可能是一个 lambda。对于同步,使用 future 可能是一个可行的想法。如果你有一对可用的 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 可能在离开后被使用函数。

关于C++:Boost::asio:WAITING同一函数中的异步处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007958/

相关文章:

C++初始化列出多个初始化

javascript - 当 JavaScript 中对象的属性值在异步函数调用期间发生更改时,该对象的属性值会发生什么情况?

c++ - 添加子子节点以 boost ptree

c++ - 令人困惑的指针声明

c++ - 如果在重载的输出运算符函数中使用 cout 怎么办?

c++ - 我可以使用迭代器访问优先级队列的元素吗?

javascript - for 循环和 promise 有问题,因为我需要遍历对象来获取值

javascript - Google Analytics - 升级到异步代码

c++ - 使用 boost 通过 TCP 序列化和发送对象

c++ - "detects_simple_anagram": memory access violation at address 0x00000000: no mapping at fault address 中的 fatal error