我想通过asio的计时器实现类似java的Timer,它用于定期执行代码。
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void print()
{
std::cout << "Hello, world!\n";
}
class WorldTimer
{
public:
boost::posix_time::ptime now()
{
return _timer.expires_at();
}
void update()
{
_f();
_timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));
_timer.async_wait(boost::bind(&WorldTimer::update, this));
}
WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io){}
private:
void (*_f)();
boost::asio::deadline_timer _timer;
};
int main() {
boost::asio::io_service io;
WorldTimer timer(io, print);
timer.update();
io.run();
return 0;
}
程序只输出Hello,world!一次,等待那里。 asio doc有一个example,它有效,但我无法弄清楚它有什么不同。
是的...计时器尚未初始化到期时间,这是修订版:
class WorldTimer
{
public:
boost::posix_time::ptime now()
{
return _timer.expires_at();
}
WorldTimer(boost::asio::io_service& io, void (*f)()) : _f(f), _timer(io, boost::posix_time::microseconds(0))
{
_timer.async_wait(boost::bind(&WorldTimer::update, this));
}
private:
void (*_f)();
boost::asio::deadline_timer _timer;
void update()
{
_f();
_timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));
_timer.async_wait(boost::bind(&WorldTimer::update, this));
}
};
int main() {
boost::asio::io_service io;
WorldTimer timer(io, print);
io.run();
return 0;
}
答案 0 :(得分:2)
您的截止日期计时器构造函数与示例中的不同。你需要explicitly set the expiry time。 示例代码使用另一个构造函数来设置particular expiry time relative to now。
因此,您看到的打印输出与您拨打update
的电话相关,后者拨打电话
_timer.expires_at(_timer.expires_at() + boost::posix_time::milliseconds(1000));
且_timer.expires_at()
尚未设置......