summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qtimer.cpp
diff options
context:
space:
mode:
authorAhmad Samir <a.samirh78@gmail.com>2023-07-14 19:21:10 +0300
committerAhmad Samir <a.samirh78@gmail.com>2023-10-27 18:44:34 +0300
commite0573e73645c0f57e46332a94160e28eb6c8ebac (patch)
tree55117f689d4d4d4f372bc93bbe4de792327c5912 /src/corelib/kernel/qtimer.cpp
parent6f1449c7ae7c05aa8866740f6b21b1cdb54fe5fb (diff)
QTimer: split QSingleShotTimer to a private header
So that it can be used in QTimer and soon-to-added QChronoTimer, this is less code duplication. Change-Id: Icc5f2028d776a34c06ba20fe41f571cd3821c64c Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/kernel/qtimer.cpp')
-rw-r--r--src/corelib/kernel/qtimer.cpp86
1 files changed, 1 insertions, 85 deletions
diff --git a/src/corelib/kernel/qtimer.cpp b/src/corelib/kernel/qtimer.cpp
index c591b0ecec..19e80ca673 100644
--- a/src/corelib/kernel/qtimer.cpp
+++ b/src/corelib/kernel/qtimer.cpp
@@ -4,6 +4,7 @@
#include "qtimer.h"
#include "qtimer_p.h"
+#include "qsingleshottimer_p.h"
#include "qabstracteventdispatcher.h"
#include "qcoreapplication.h"
@@ -253,90 +254,6 @@ void QTimer::timerEvent(QTimerEvent *e)
}
}
-class QSingleShotTimer : public QObject
-{
- Q_OBJECT
- int timerId = -1;
-public:
- ~QSingleShotTimer();
- QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, const char * m);
- QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, QtPrivate::QSlotObjectBase *slotObj);
-
- void startTimerForReceiver(int msec, Qt::TimerType timerType, const QObject *receiver);
-
-Q_SIGNALS:
- void timeout();
-protected:
- void timerEvent(QTimerEvent *) override;
-};
-
-QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, const char *member)
- : QObject(QAbstractEventDispatcher::instance())
-{
- connect(this, SIGNAL(timeout()), r, member);
-
- startTimerForReceiver(msec, timerType, r);
-}
-
-QSingleShotTimer::QSingleShotTimer(int msec, Qt::TimerType timerType, const QObject *r, QtPrivate::QSlotObjectBase *slotObj)
- : QObject(QAbstractEventDispatcher::instance())
-{
- int signal_index = QMetaObjectPrivate::signalOffset(&staticMetaObject);
- Q_ASSERT(QMetaObjectPrivate::signal(&staticMetaObject, signal_index).name() == "timeout");
- QObjectPrivate::connectImpl(this, signal_index, r ? r : this, nullptr, slotObj,
- Qt::AutoConnection, nullptr, &staticMetaObject);
-
- startTimerForReceiver(msec, timerType, r);
-}
-
-QSingleShotTimer::~QSingleShotTimer()
-{
- if (timerId > 0)
- killTimer(timerId);
-}
-
-/*
- Move the timer, and the dispatching and handling of the timer event, into
- the same thread as where it will be handled, so that it fires reliably even
- if the thread that set up the timer is busy.
-*/
-void QSingleShotTimer::startTimerForReceiver(int msec, Qt::TimerType timerType, const QObject *receiver)
-{
- if (receiver && receiver->thread() != thread()) {
- // Avoid leaking the QSingleShotTimer instance in case the application exits before the timer fires
- connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, &QObject::deleteLater);
- setParent(nullptr);
- moveToThread(receiver->thread());
-
- QDeadlineTimer deadline(std::chrono::milliseconds{msec}, timerType);
- QMetaObject::invokeMethod(this, [this, deadline, timerType]{
- if (deadline.hasExpired())
- emit timeout();
- else
- timerId = startTimer(std::chrono::milliseconds{deadline.remainingTime()}, timerType);
- }, Qt::QueuedConnection);
- } else {
- timerId = startTimer(std::chrono::milliseconds{msec}, timerType);
- }
-}
-
-
-void QSingleShotTimer::timerEvent(QTimerEvent *)
-{
- // need to kill the timer _before_ we emit timeout() in case the
- // slot connected to timeout calls processEvents()
- if (timerId > 0)
- killTimer(timerId);
- timerId = -1;
-
- emit timeout();
-
- // we would like to use delete later here, but it feels like a
- // waste to post a new event to handle this event, so we just unset the flag
- // and explicitly delete...
- qDeleteInEventHandler(this);
-}
-
/*!
\internal
@@ -699,5 +616,4 @@ QBindable<Qt::TimerType> QTimer::bindableTimerType()
QT_END_NAMESPACE
-#include "qtimer.moc"
#include "moc_qtimer.cpp"