如何将boost::asio::d eadline_timer 与Qt一起使用?



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

  • 我的问题示例

注意:

  • 我需要很长的间隔,QTimer无法长时间工作。

根据您之前问题的答案,仅使用 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 << " passedn";
});
auto id = dt.start(QDateTime::currentDateTime().addYears(1));

最新更新