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

Posted

技术标签:

【中文标题】如何获取错误对象?在deadline_timer中使用成员函数时【英文标题】:How to get error object? when use member function in deadline_timer 【发布时间】:2014-10-23 06:43:28 【问题描述】:

我使用 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));

【问题讨论】:

您没有提供编译器错误消息。这很奇怪,因为您对此有疑问。 @sehe 谢谢 :) 我写了一个错误的成员函数签名,比如 void print(boost::system::error_code ec)。 const 关键字被省略。而且,我下次必须写错误信息。 【参考方案1】:

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

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

【讨论】:

以上是关于如何获取错误对象?在deadline_timer中使用成员函数时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Qt 中使用 boost::asio::deadline_timer?

获取Boost deadline_timer原生文件描述符

在两个线程之间共享deadline_timer

使用boost的deadline_timer实现一个异步定时器

使用许多 boost::asio::deadline_timer [重复]

boost::asio::deadline_timer 绑定到多态套接字类指针