如何获取错误对象?在deadline_timer中使用成员函数时

时间:2014-10-23 06:43:28

标签: boost timer boost-asio

我使用boost :: asio :: deadline_timer使用成员函数作为处理程序(回调函数)。

如果取消定时器,如何在print()成员函数中获取错误对象?

class printer
{
public:
    printer(boost::asio::io_service& io)
        : timer_(io, boost::posix_time::seconds(1)),
          count_(0)
    {
        timer_.async_wait(boost::bind(&printer::print, this));
    }
    ~printer()
    {
        std::cout << "Final count is " << count_ << "\n";
    }
    void print()
    {
        if (count_ < 5)
        {
            std::cout << count_ << "\n";
            ++count_;

            timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
            timer_.async_wait(boost::bind(&printer::print, this));
        }
    }

private:
    boost::asio::deadline_timer timer_;
    int count_;
};

int main()
{
    boost::asio::io_service io;
    printer p(io);
    io.run();

    return 0;
}

我尝试在async_wait()中使用bind设置错误对象,但它是编译错误

timer_.async_wait(boost::bind(&printer::print, this, boost::asio::placeholders::error));

1 个答案:

答案 0 :(得分:0)

只要您的方法签名匹配,就应该没问题:

void print(boost::system::error_code const ec)

// and

boost::bind(&printer::print, this, boost::asio::placeholders::error)

查看 Live On Coliru

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

class printer
{
public:
    printer(boost::asio::io_service& io)
        : timer_(io, boost::posix_time::seconds(1)),
          count_(0)
    {
        timer_.async_wait(boost::bind(&printer::print, this, boost::asio::placeholders::error));
    }
    ~printer()
    {
        std::cout << "Final count is " << count_ << "\n";
    }

    void print(boost::system::error_code const ec)
    {
        if (ec)
            std::cout << "Error: " << ec.message() << "\n";
        if (count_ < 5)
        {
            std::cout << count_ << "\n";
            ++count_;

            timer_.expires_at(timer_.expires_at() + boost::posix_time::seconds(1));
            timer_.async_wait(boost::bind(&printer::print, this, boost::asio::placeholders::error));
        }
    }

private:
    boost::asio::deadline_timer timer_;
    int count_;
};

int main()
{
    boost::asio::io_service io;
    printer p(io);
    io.run();
}