59 lines
1.2 KiB
C
59 lines
1.2 KiB
C
|
|
#ifndef DATALOADER_H
|
|||
|
|
#define DATALOADER_H
|
|||
|
|
|
|||
|
|
#include <QObject>
|
|||
|
|
#include <QRunnable>
|
|||
|
|
#include <QThreadPool>
|
|||
|
|
#include <QHash>
|
|||
|
|
#include <QMutex>
|
|||
|
|
#include <QVariant>
|
|||
|
|
|
|||
|
|
class DataLoader : public QObject
|
|||
|
|
{
|
|||
|
|
Q_OBJECT
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
explicit DataLoader(QObject* parent = nullptr);
|
|||
|
|
~DataLoader();
|
|||
|
|
|
|||
|
|
void requestData(const QString& dataKey);
|
|||
|
|
void cancelRequest(const QString& dataKey);
|
|||
|
|
void setMaxThreads(int count);
|
|||
|
|
|
|||
|
|
signals:
|
|||
|
|
void dataLoaded(const QString& dataKey, const QVariant& data);
|
|||
|
|
void errorOccurred(const QString& dataKey, const QString& error);
|
|||
|
|
|
|||
|
|
public slots:
|
|||
|
|
void handleShutdown();
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
class LoadTask : public QRunnable
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
LoadTask(DataLoader* loader, const QString& key)
|
|||
|
|
:m_loader(loader), m_key(key)
|
|||
|
|
{
|
|||
|
|
setAutoDelete(false);//禁用自动析构,由DataLoader控制管理
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void run() override
|
|||
|
|
{
|
|||
|
|
QVariant data = fetchRealData(m_key);
|
|||
|
|
emit m_loader->dataLoaded(m_key, data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
QVariant fetchRealData(const QString& dataKey);
|
|||
|
|
|
|||
|
|
DataLoader* m_loader;
|
|||
|
|
QString m_key;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
QThreadPool m_threadPool;
|
|||
|
|
QHash<QString, LoadTask*> m_runningTasks;
|
|||
|
|
QMutex m_taskMutex;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|