#pragma once #include "euiSingletonGlobal.h" #include #include #include #include #include #include #include #include class TimedTaskSchedulerThread; class EUI_SERVICE_API TimedTask : public QObject { Q_OBJECT public: using Callback = std::function; explicit TimedTask(QObject* parent = nullptr); ~TimedTask() override; bool addTask(const QString& taskId, int seconds, int minutes, int hours, Callback callback); bool removeTask(const QString& taskId); void clearTasks(); bool isActive() const; QStringList taskIds() const; signals: void taskTriggered(const QString& taskId); private slots: void onTimeout(); private: friend class TimedTaskSchedulerThread; struct TaskEntry { qint64 intervalMilliseconds = 0; qint64 elapsedMilliseconds = 0; quint64 generation = 0; Callback callback; }; static qint64 toSeconds(int seconds, int minutes, int hours); static qint64 monotonicNowMs(); Q_DISABLE_COPY(TimedTask) // 回调在专用调度线程执行,不得直接访问 QWidget;需要时请投递到目标线程。 std::unique_ptr schedulerThread_; QHash tasks_; mutable QMutex mutex; QWaitCondition callbackFinished_; QHash runningCallbacks_; quint64 nextGeneration_ = 0; qint64 lastTickMs_ = 0; bool shuttingDown_ = false; }; EUI_SERVICE_API TimedTask& appTimedTask();