2025-07-02 09:56:58 +08:00
|
|
|
|
#ifndef DATAMANAGER_H
|
|
|
|
|
|
#define DATAMANAGER_H
|
|
|
|
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
|
#include <QHash>
|
|
|
|
|
|
#include <QQueue>
|
|
|
|
|
|
#include <QVariant>
|
2025-08-21 17:23:52 +08:00
|
|
|
|
#include <QPointer>
|
2025-07-02 09:56:58 +08:00
|
|
|
|
#include <QTimer>
|
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
|
#include <QMutexLocker>
|
|
|
|
|
|
#include <QReadWriteLock>
|
|
|
|
|
|
|
|
|
|
|
|
class HttpRequestManager;
|
|
|
|
|
|
class DataManager : public QObject
|
|
|
|
|
|
{
|
|
|
|
|
|
Q_OBJECT
|
|
|
|
|
|
Q_DISABLE_COPY(DataManager) //禁止拷贝,等价于:DataManager(const DataManager&) = delete; DataManager& operator=(const DataManager&) = delete;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
struct CacheEntry
|
|
|
|
|
|
{
|
|
|
|
|
|
QVariant data;
|
|
|
|
|
|
QDateTime timestamp;
|
|
|
|
|
|
int accessCount = 0;
|
|
|
|
|
|
bool isUpdating = false;
|
|
|
|
|
|
//QSet<QObject*> pendingRequests;
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static DataManager* instance();
|
|
|
|
|
|
|
|
|
|
|
|
void registerDataSource(const QString& dataKey, std::function<QVariant()> fetcher);
|
|
|
|
|
|
void registerHttpDataSource(const QString& dataKey, const QUrl& url, const QByteArray& method = "GET",
|
|
|
|
|
|
const QByteArray& body = QByteArray(), const QMap<QByteArray, QByteArray>& headers = {});
|
|
|
|
|
|
QVariant getCacheData(const QString& dataKey);
|
|
|
|
|
|
bool hasData(const QString& dataKey);
|
|
|
|
|
|
void requestData(const QString& dataKey, QObject* requester);
|
|
|
|
|
|
void setCacheTimeout(int seconds);
|
|
|
|
|
|
HttpRequestManager* httpManager();
|
|
|
|
|
|
|
|
|
|
|
|
signals:
|
2025-08-21 17:23:52 +08:00
|
|
|
|
void dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp);
|
2025-07-02 09:56:58 +08:00
|
|
|
|
void cacheInvalidated(const QString& dataKey);
|
|
|
|
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
|
|
void invalidateCache(const QString& dataKey = QString());
|
|
|
|
|
|
void processRequestQueue();
|
|
|
|
|
|
|
|
|
|
|
|
void handleHttpDataReceived(const QString& dataKey, const QVariant& data);
|
|
|
|
|
|
void handleHttpRequsetFailed(const QString& dataKey, const QVariant& data);
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
struct RequestInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
QString dataKey;
|
2025-08-21 17:23:52 +08:00
|
|
|
|
//QObject* requester;
|
|
|
|
|
|
QPointer<QObject> requester;
|
2025-07-02 09:56:58 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
explicit DataManager();
|
|
|
|
|
|
~DataManager();
|
|
|
|
|
|
|
|
|
|
|
|
void triggerDataUpdate(const QString& dataKey);
|
|
|
|
|
|
|
|
|
|
|
|
QHash<QString, CacheEntry> m_cache;
|
|
|
|
|
|
QHash<QString, std::function<QVariant()>> m_dataSources;
|
|
|
|
|
|
QSet<QString> m_pendingUpdates;
|
|
|
|
|
|
QQueue<RequestInfo> m_requestQueue;
|
|
|
|
|
|
QTimer m_requestTimer;
|
|
|
|
|
|
QReadWriteLock m_cacheLock;
|
|
|
|
|
|
QMutex m_requestMutex;
|
|
|
|
|
|
HttpRequestManager* m_httpManager;
|
|
|
|
|
|
int m_cacheTimeout = 300; //默认5分钟
|
|
|
|
|
|
int m_minRefreshInterval = 100; //最小刷新间隔(ms)
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|