PowerMaster/include/dataManager.h

78 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef DATAMANAGER_H
#define DATAMANAGER_H
#include <QObject>
#include <QHash>
#include <QQueue>
#include <QVariant>
#include <QPointer>
#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:
void dataUpdated(const QString& dataKey, const QVariant& data, const QDateTime& timestamp);
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;
//QObject* requester;
QPointer<QObject> requester;
};
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