如何在 Qt 中使用 boost::asio::deadline_timer?

Posted

技术标签:

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

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

Example of my problem

注意:

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

【问题讨论】:

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

【讨论】:

以上是关于如何在 Qt 中使用 boost::asio::deadline_timer?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2017 中使用 Qt 库?

如何使用Qt插件在Qt中进行ROS开发

如何在 Qt 中使用 GeographicLib

如何在 Qt 中使用彩色字符串设置窗口标题?

如何使用 Qt 在 MainWindow 中显示 QForm?

如何在Qt中使用自定义数据类型