Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:asio:async#u resolve()不';不起作用(使用lambda函数),但resolve()起作用_C++_Boost_Lambda_Boost Asio - Fatal编程技术网

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();