2015-08-14 76 views
1

boost::asio中,從this例子開始,是否可以在同一函數中等待處理程序?所以像這樣:C++: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的事件循環。

+0

我不明白。你想同步使用異步調用? –

+0

@LightnessRacesinOrbit也許這是一種陳述方式...我只需要在相同的功能發生的反應。 –

+1

您可以使用lambda函數或協程。 – ForEveR

回答

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可能在離開函數後使用。

+0

有什麼理由可以說爲什麼人們更喜歡使用Boost.Asio的[對期貨的頭等支持](http://www.boost.org/doc/)庫/ 1_59_0/DOC/HTML/boost_asio /概述/ cpp2011/futures.html)? –