diff --git a/src/service/plugins/sqlite/ResourceScoreMaintainer.h b/src/service/plugins/sqlite/ResourceScoreMaintainer.h --- a/src/service/plugins/sqlite/ResourceScoreMaintainer.h +++ b/src/service/plugins/sqlite/ResourceScoreMaintainer.h @@ -20,6 +20,8 @@ #ifndef PLUGINS_SQLITE_RESOURCE_SCORE_MAINTAINER_H #define PLUGINS_SQLITE_RESOURCE_SCORE_MAINTAINER_H +#include + // Utils #include @@ -29,7 +31,7 @@ /** * ResourceScoreMaintainer represents a queue of resource processing requests. */ -class ResourceScoreMaintainer { +class ResourceScoreMaintainer: public QObject { public: static ResourceScoreMaintainer *self(); diff --git a/src/service/plugins/sqlite/ResourceScoreMaintainer.cpp b/src/service/plugins/sqlite/ResourceScoreMaintainer.cpp --- a/src/service/plugins/sqlite/ResourceScoreMaintainer.cpp +++ b/src/service/plugins/sqlite/ResourceScoreMaintainer.cpp @@ -23,7 +23,6 @@ // Qt #include #include -#include // System @@ -38,61 +37,61 @@ #include "ResourceScoreCache.h" -class ResourceScoreMaintainer::Private : public QThread { +class ResourceScoreMaintainer::Private { public: + Private() + { + } + ~Private(); + typedef QString ApplicationName; typedef QString ActivityID; typedef QList ResourceList; typedef QHash Applications; typedef QHash ResourceTree; ResourceTree scheduledResources; - QMutex scheduledResources_mutex; - void run() Q_DECL_OVERRIDE; void processActivity(const ActivityID &activity, const Applications &applications); + + void processResources(); + + QTimer processResourcesTimer; }; ResourceScoreMaintainer::Private::~Private() { - requestInterruption(); - wait(1500); // Enough time for the sleep(1) + processing in run() } -void ResourceScoreMaintainer::Private::run() +void ResourceScoreMaintainer::Private::processResources() { using namespace kamd::utils; - while (!isInterruptionRequested()) { - // initial delay before processing the resources - sleep(1); - - ResourceTree resources; + // initial delay before processing the resources + sleep(1); - { - QMutexLocker lock(&scheduledResources_mutex); - std::swap(resources, scheduledResources); - } + ResourceTree resources; - const auto activity = StatsPlugin::self()->currentActivity(); + std::swap(resources, scheduledResources); - // Let us first process the events related to the current - // activity so that the stats are available quicker + const auto activity = StatsPlugin::self()->currentActivity(); - if (resources.contains(activity)) { - processActivity(activity, resources[activity]); - resources.remove(activity); - } + // Let us first process the events related to the current + // activity so that the stats are available quicker - for_each_assoc(resources, - [this](const ActivityID & activity, const Applications & applications) { - processActivity(activity, applications); - } - ); + if (resources.contains(activity)) { + processActivity(activity, resources[activity]); + resources.remove(activity); } + + for_each_assoc(resources, + [this](const ActivityID & activity, const Applications & applications) { + processActivity(activity, applications); + } + ); } void ResourceScoreMaintainer::Private::processActivity(const ActivityID @@ -118,8 +117,11 @@ } ResourceScoreMaintainer::ResourceScoreMaintainer() - : d() { + d->processResourcesTimer.setInterval(1000); + d->processResourcesTimer.setSingleShot(true); + connect(&d->processResourcesTimer, &QTimer::timeout, + this, [=] { d->processResources(); }); } ResourceScoreMaintainer::~ResourceScoreMaintainer() @@ -129,8 +131,6 @@ void ResourceScoreMaintainer::processResource(const QString &resource, const QString &application) { - QMutexLocker lock(&d->scheduledResources_mutex); - // Checking whether the item is already scheduled for // processing @@ -153,5 +153,5 @@ d->scheduledResources[activity][application] << resource; } - d->start(); + d->processResourcesTimer.start(); }