2015-05-22 24 views
0

以下是关于Boost库文档的代码。如何让boost/asio库重复计时器?

#include <iostream> 
#include <boost/asio.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

void print(const boost::system::error_code& /*e*/) 
{ 
    std::cout << "Hello, world!\n"; 
} 

int main() 
{ 
    boost::asio::io_service io; 

    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(print); 

    io.run(); 

    return 0; 
} 

现在,当我运行上述程序,它只是等待5秒,然后打印Hello World并停止。 我希望这个程序每5秒钟一直打印Hello World。 这可能吗?

回答

4

您可以通过在您的定时器处理程序中调用deadline_timer::expires_from_nowdeadline_timer::async_wait来完成此操作,这将在最后一个过期时添加一个定时器。例如:

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

void print(const boost::system::error_code& /*e*/, 
    boost::asio::deadline_timer* t, int* count) 
{ 
    if (*count < 5) 
    { 
    std::cout << *count << std::endl; 
    ++(*count); 

    t->expires_at(t->expires_at() + boost::posix_time::seconds(5)); 
    t->async_wait(boost::bind(print, 
      boost::asio::placeholders::error, t, count)); 
    } 
} 

int main() 
{ 
    boost::asio::io_service io; 

    int count = 0; 
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
    t.async_wait(boost::bind(print, 
     boost::asio::placeholders::error, &t, &count)); 

    io.run(); 

    std::cout << "Final count is " << count << std::endl; 

    return 0; 
} 

代码是从Boosts Asio tutorials