簡體   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