Как использовать boost :: asio :: deadline_timer с Qt? - PullRequest
0 голосов
/ 21 июня 2020

Как можно использовать boost::asio::deadline_timer с Qt? Я новичок в библиотеке Boost C ++ и пробую примеры документации в отдельном проекте, и он работает. Но я не мог использовать его в своем проекте, который использует Qt для GUI.

Примечание:

  • Мне нужен длинный интервал, а QTimer не может работать с длинным интервалом.

1 Ответ

0 голосов
/ 21 июня 2020

Основываясь на ответе на ваш предыдущий вопрос , очень легко реализовать свой собственный таймер крайнего срока, используя только Qt (похоже, вы бы предпочли) ...

class deadline_timer: public QObject {
  using super = QObject;
  Q_OBJECT;
public:
  using deadline_id = uint_least64_t;
signals:
  void timeout(deadline_id, QDateTime) const;
public:
  explicit deadline_timer (int resolution_milliseconds = 1000, QObject *parent = nullptr)
    : super(parent)
    {
      m_timer.setInterval(resolution_milliseconds);
      QObject::connect(&m_timer, &QTimer::timeout, this, &deadline_timer::handle_timeout);
    }

  /*
   * Adds a new deadline and returns associated id.  When the deadline is
   * reached the timeout signal will be emitted with the corresponding id
   * and time.
   */
  deadline_id start (const QDateTime &deadline)
    {
      m_deadlines[deadline].insert(++s_id);
      if (!m_timer.isActive()) {
        m_timer.start();
      }
      return s_id;
    }
  void stop ()
    {
      m_timer.stop();
    }
private:
  void handle_timeout ()
    {
      auto now = QDateTime::currentDateTime();
      for (auto i = m_deadlines.begin(); i != m_deadlines.end() && now >= i->first; i = m_deadlines.begin()) {
        for (const auto &j: i->second) {
          emit timeout(j, i->first);
        }
        m_deadlines.erase(i);
      }
      if (m_deadlines.empty()) {
        m_timer.stop();
      }
    }
  static deadline_id                         s_id;
  QTimer                                     m_timer;
  std::map<QDateTime, std::set<deadline_id>> m_deadlines;
};

deadline_timer::deadline_id deadline_timer::s_id = 0;

Использование как ...

deadline_timer dt;
QObject::connect(&dt, &deadline_timer::timeout,
                 [](deadline_timer::deadline_id id, QDateTime deadline)
                   {
                     std::cout << "\ndeadline " << id << " passed\n";
                 });
auto id = dt.start(QDateTime::currentDateTime().addYears(1));
...