【问题标题】:How to use boost::asio::deadline_timer with Qt?如何在 Qt 中使用 boost::asio::deadline_timer?
【发布时间】:2020-06-21 07:45:26
【问题描述】:

如何将 boost::asio::deadline_timer 与 Qt 一起使用?我是 Boost C++ 库的新手,并在单独的项目中尝试文档示例并且它可以工作。但我无法在我的项目中使用它,它使用 Qt 的 GUI。

注意:

  • 我需要一个长间隔,而QTimer 无法使用长间隔。

【问题讨论】:

  • 如果您使用Qt,为什么还需要boost::asioQt 提供比 boost::asio 更易于使用的 IMO 网络 API。
  • @MarekR,我没有说任何关于网络的事情,我需要一个长间隔的计时器,我看到boost::asio::deadline_timer 是我需要的。但是与Qt一起使用时会出现问题。
  • 您的问题显然来自XY problem。请描述您的实际问题,描述您需要实现的功能。
  • @MarekR,长间隔定时器。 (在我的问题的注释部分)。

标签: c++ qt boost


【解决方案1】:

根据您对previous question 的回答,仅使用 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    相关资源
    最近更新 更多