如何在 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。
注意:
我需要一个长间隔,而QTimer
无法使用长间隔。
【问题讨论】:
如果您使用Qt
,为什么还需要boost::asio
? Qt
提供比 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 库?