使用boost :: asio :: deadline_timer实现通用Timer类时遇到问题

时间:2014-01-03 15:35:36

标签: c++ boost

在UI应用程序上实现计时器类。

基本上我遇到的问题是调用io.run()会阻塞,导致async_wait调用无用。从阅读其他帖子我得到的印象是,某种方式Timer,或者至少是调用startCountdown的代码,应该在另一个线程上。

以下是我的代码。如何以在Boost中认为正确的方式管理它?

class Timer
{
public:

    Timer() : countdownTimer(io) {  }

    void startCountdown(int seconds)
    {
        countdownTimer.expires_from_now(boost::posix_time::seconds(seconds));
        countdownTimer.async_wait(boost::bind(&Timer::on_timeout, this, _1));
        io.run(); // this blocks
    }

    void on_timeout(const boost::system::error_code& e)
    {
        if (e != boost::asio::error::operation_aborted) {
            cout << "Timer expired!";
        }
    }

private:

    boost::asio::io_service io;
    boost::asio::deadline_timer countdownTimer;
}

1 个答案:

答案 0 :(得分:2)

你不应该调用run的{​​{1}}成员函数,而应该调用其中一个:

取决于您的设计目标。

另请注意,io_service并非真正设计为用于某些功能的辅助库,而是作为程序的核心元素,它更像是一个脊椎而不是手臂。

专门处理链接到io_service的所有内容的线程也可以工作,但是在同步和异步世界之间同步共享数据的好运:)