Основываясь на ответе на ваш предыдущий вопрос , очень легко реализовать свой собственный таймер крайнего срока, используя только 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));