使用asio库时为什么计时器不起作用?

时间:2013-11-15 11:28:39

标签: c++ boost boost-asio

代码是:

初始化对象:

tcp_client tcp_client_obj(*this,io_service,tcp_peer_context, ip_, port_, "", datas, ret, stdout_msgs, stderr_msgs,peer_check_flag_,deploy_type_);
            io_service.run();

成员函数:

  void tcp_client::handle_total_timeout(const boost::system::error_code& error_)
       {
            if (error_ != boost::asio::error::operation_aborted)
            {
                stderr_msgs.push_back("proxy total timeout");
                ret = MESSAGE_ERROR_CLIENT_TOTAL_TIMEOUT;
                close();
            }
        }

    void tcp_client::start()
        {
            boost::asio::ip::tcp::resolver resolver(socket.get_io_service());
            string temp = boost::lexical_cast<string>(port);
            boost::asio::ip::tcp::resolver::query query(ip.c_str(), temp.c_str());
            boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);


            total_timer.expires_from_now(boost::posix_time::seconds(total_timeout));
            total_timer.async_wait(boost::bind(&tcp_client::handle_total_timeout,  this, boost::asio::placeholders::error));

            connect_timer.expires_from_now(boost::posix_time::seconds(connect_timeout));
            connect_timer.async_wait(boost::bind(&tcp_client::handle_connect_timeout,  this, boost::asio::placeholders::error));

            now_time = global::currenttime::getms();
            boost::asio::async_connect(socket.lowest_layer(), iterator, boost::bind(&tcp_client::handle_connect, this,boost::asio::placeholders::error));
            LDeployInfo(str(format("[TCP Client] Connecting server@%s:%d") % ip % port));
        }

我想测试handle_total_time()的功能。所以我添加了代码

bool tcp_client::check_release_md5()
    {
          while()
          {
             //just test this.
          }
          /*
           * do somethings.
           */
         }

check_release_md5将在start()函数之后调用。
为什么handle_total_timeout()无法正常工作
实际上,check_release_md5将永远运行。

1 个答案:

答案 0 :(得分:2)

编辑: 亲爱的来自未来的人们: 事实证明,问题是被调用的第一个处理程序从未返回。因此,io_service无法发布()第二个,这将取消第一个。

首先让我说出我的个人观点:以某种方式标记成员变量。

你是否保证io_service.run()在你到达时仍在运行?更确切地说,你可以在构造之后但在调用start()之前调用io_service.run()吗?

在那种情况下,io_service已经返回,并且不会处理任何内容。还有另外一种可能性:io_service可能在代码的某个早期点运行()并且你忘了重置()它吗?