当我使用 expire_at 时,Boost deadline_timer 没有生成事件?
Boost deadline_timer is not generating event when i am using expire_at?
class 头文件
//dividandconquer.h
#ifndef DIVIDANDCONQUER_H
#define DIVIDANDCONQUER_H
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/date.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
class dividandconquer
{
public:
dividandconquer(boost::asio::io_service& io);
int lb =0;
int ub =1000;
int mb =0;
ptime t1;
ptime finaltimer;
void reset(int);
void print();
private:
boost::asio::deadline_timer timer_;
int count_;
};
#endif // DIVIDANDCONQUER_H
在构造函数内部,我试图在特定时间触发计时器(使用 expire_at),但它不起作用。但是如果我使用 expires_from_now 它工作正常。
文件名:dividandconquer.cpp
#include "dividandconquer.h"
dividandconquer::dividandconquer(boost::asio::io_service& io)
: timer_(io),
count_(0)
{
t1=ptime( (boost::gregorian::day_clock::local_day()), hours(15)+minutes(12));
timer_.expires_at(t1);
timer_.async_wait(boost::bind(&dividandconquer::print, this));
}
void dividandconquer::reset(int upordown)// 0 means lowebound 1 means uperbound
{
if (mb>0)
{
if (0==upordown)
{ mb=(lb+ub)/2;
ub=mb;
}
else
{
mb=(ub-lb)/2;
lb=mb;
}
}
}
void dividandconquer::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));
}
}
主文件
#include <QApplication>
#include "dividandconquer.h"
#include <boost/asio.hpp>
int main(int argc, char *argv[])
{
boost::asio::io_service io;
dividandconquer d1(io);
io.run();
return 0;
}
主要问题是 asio::deadline_timer
期望 UTC 中的绝对时间点,但 gregorian::day_clock::local_day()
returns local 日期没有任何时间分量;我相信这是您正在寻找的工作(和简化)版本:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/deadline_timer.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/system/error_code.hpp>
using namespace boost::posix_time;
using boost::system::error_code;
struct dividandconquer {
explicit dividandconquer(boost::asio::io_service& io) : timer_(io) {
timer_.expires_at(microsec_clock::universal_time() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
void print() {
if (count_ < 5) {
std::cout
<< microsec_clock::universal_time().time_of_day().ticks()
<< " :: " << count_++ << '\n';
timer_.expires_at(timer_.expires_at() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
}
private:
boost::asio::deadline_timer timer_;
int count_{};
};
int main() {
boost::asio::io_service io;
dividandconquer d1{io};
io.run();
}
(如果你真的想坚持 bind
而不是使用 lambda,请参阅 here。)
由于您使用的是 C++11,因此最好避免以任何方式涉及 Boost.Date_Time,而是使用标准库:
#include <chrono>
#include <boost/asio/steady_timer.hpp>
using namespace std::chrono;
struct dividandconquer {
explicit dividandconquer(boost::asio::io_service& io) : timer_(io) {
timer_.expires_at(steady_clock::now() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
void print() {
if (count_ < 5) {
std::cout
<< steady_clock::now().time_since_epoch().count()
<< " :: " << count_++ << '\n';
timer_.expires_at(timer_.expires_at() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
}
private:
boost::asio::steady_timer timer_;
int count_{};
};
class 头文件 //dividandconquer.h
#ifndef DIVIDANDCONQUER_H
#define DIVIDANDCONQUER_H
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/date_time/date.hpp>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using namespace boost::posix_time;
using namespace boost::gregorian;
class dividandconquer
{
public:
dividandconquer(boost::asio::io_service& io);
int lb =0;
int ub =1000;
int mb =0;
ptime t1;
ptime finaltimer;
void reset(int);
void print();
private:
boost::asio::deadline_timer timer_;
int count_;
};
#endif // DIVIDANDCONQUER_H
在构造函数内部,我试图在特定时间触发计时器(使用 expire_at),但它不起作用。但是如果我使用 expires_from_now 它工作正常。
文件名:dividandconquer.cpp
#include "dividandconquer.h"
dividandconquer::dividandconquer(boost::asio::io_service& io)
: timer_(io),
count_(0)
{
t1=ptime( (boost::gregorian::day_clock::local_day()), hours(15)+minutes(12));
timer_.expires_at(t1);
timer_.async_wait(boost::bind(&dividandconquer::print, this));
}
void dividandconquer::reset(int upordown)// 0 means lowebound 1 means uperbound
{
if (mb>0)
{
if (0==upordown)
{ mb=(lb+ub)/2;
ub=mb;
}
else
{
mb=(ub-lb)/2;
lb=mb;
}
}
}
void dividandconquer::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));
}
}
主文件
#include <QApplication>
#include "dividandconquer.h"
#include <boost/asio.hpp>
int main(int argc, char *argv[])
{
boost::asio::io_service io;
dividandconquer d1(io);
io.run();
return 0;
}
主要问题是 asio::deadline_timer
期望 UTC 中的绝对时间点,但 gregorian::day_clock::local_day()
returns local 日期没有任何时间分量;我相信这是您正在寻找的工作(和简化)版本:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/deadline_timer.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/system/error_code.hpp>
using namespace boost::posix_time;
using boost::system::error_code;
struct dividandconquer {
explicit dividandconquer(boost::asio::io_service& io) : timer_(io) {
timer_.expires_at(microsec_clock::universal_time() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
void print() {
if (count_ < 5) {
std::cout
<< microsec_clock::universal_time().time_of_day().ticks()
<< " :: " << count_++ << '\n';
timer_.expires_at(timer_.expires_at() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
}
private:
boost::asio::deadline_timer timer_;
int count_{};
};
int main() {
boost::asio::io_service io;
dividandconquer d1{io};
io.run();
}
(如果你真的想坚持 bind
而不是使用 lambda,请参阅 here。)
由于您使用的是 C++11,因此最好避免以任何方式涉及 Boost.Date_Time,而是使用标准库:
#include <chrono>
#include <boost/asio/steady_timer.hpp>
using namespace std::chrono;
struct dividandconquer {
explicit dividandconquer(boost::asio::io_service& io) : timer_(io) {
timer_.expires_at(steady_clock::now() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
void print() {
if (count_ < 5) {
std::cout
<< steady_clock::now().time_since_epoch().count()
<< " :: " << count_++ << '\n';
timer_.expires_at(timer_.expires_at() + milliseconds(500));
timer_.async_wait([this](error_code const&){ print(); });
}
}
private:
boost::asio::steady_timer timer_;
int count_{};
};