C++ C++;:asio:async#u resolve()不';不起作用(使用lambda函数),但resolve()起作用
根据示例,我的程序中有以下同步初始化部分:C++ C++;:asio:async#u resolve()不';不起作用(使用lambda函数),但resolve()起作用,c++,boost,lambda,boost-asio,C++,Boost,Lambda,Boost Asio,根据示例,我的程序中有以下同步初始化部分: io_service = new boost::asio::io_service; resolver = new boost::asio::ip::tcp::resolver(*io_service); query = new boost::asio::ip::tcp::resolver::query(data.serverAddress.c_str(),data.serverPort.c_str()); iterator = res
io_service = new boost::asio::io_service;
resolver = new boost::asio::ip::tcp::resolver(*io_service);
query = new boost::asio::ip::tcp::resolver::query(data.serverAddress.c_str(),data.serverPort.c_str());
iterator = resolver->resolve(*query);
//...
现在,除了在没有连接的情况下调用resolver->resolve(*query)之外,这一切都可以正常工作,没有任何问题代码>无限块。为了解决这个问题,我决定使用resolver->async\u resolve(*query)代码>取而代之。因此,我编写了以下代码以与lambda函数同步运行,因此以下代码替换了前一代码的最后一条语句:
boost::system::error_code queryError;
boost::function<void(const boost::system::error_code&,const boost::asio::ip::tcp::resolver::iterator&)> queryLambda =
[&querySuccess,&queryError,this]
(const boost::system::error_code& errorCode, const boost::asio::ip::tcp::resolver::iterator& it)
{std::cout<<"Success!"<<std::endl;querySuccess=1;iterator=it;queryError=errorCode;};
resolver->async_resolve(*query,queryLambda);
int timeout = 10000;
int totalTime = 0;
int timeWaitStep = 1000;
while(true)
{
std::cout<<"Trying to connect..."<<std::endl;
sleep(timeWaitStep);
if(querySuccess)
{
break;
}
else
{
totalTime += timeWaitStep;
std::cout<<totalTime<<std::endl;
if(totalTime > timeout)
{
throw std::domain_error("Unable to connect to server. Make sure you have a valid connection.");
}
}
}
boost::system::error\u code queryError;
boost::函数queryLambda=
[&querySuccess,&queryError,this]
(const boost::system::error\u code&errorCode,const boost::asio::ip::tcp::resolver::iterator&it)
{std::cout你应该运行
在某处工作,使用io_服务::运行
函数,或者io_服务::轮询
。顺便说一句,如果你想解决
超时问题,你应该使用截止时间计时器
和异步等待
你应该运行
在某处工作,使用io_服务::运行
函数,或io\u服务::poll
。顺便说一句,如果你想解决超时问题,你应该在Boost中使用截止时间计时器和异步等待。Asio发出异步操作意味着你计划在io\u服务内调用它,所有这些操作都不会发生,除非您告诉io\u服务
它应该开始轮询网络,执行预定操作并调用您的回调。这是io\u服务::poll
和io\u服务::run
等方法所做的
最简单的方法是在调用async\u resolve
之后调用io\u service::run
:
...
resolver->async_resolve(*query,queryLambda);
io_service->run();
在Boost.Asio中,发出异步操作意味着您计划在io_服务
中调用它;除非您告诉io_服务
它应该开始轮询网络、执行计划操作并调用回调,否则所有这些操作都不会发生ice::轮询
和io_服务::运行
do
最简单的方法是在调用async\u resolve
之后调用io\u service::run
:
...
resolver->async_resolve(*query,queryLambda);
io_service->run();