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