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

Online Demo

(如果你真的想坚持 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_{};
};

Online Demo