Files
BloomPatched/src/Insight/InsightWorker/InsightWorker.cpp

93 lines
2.9 KiB
C++
Raw Normal View History

#include "InsightWorker.hpp"
2021-04-04 21:04:12 +01:00
#include <QObject>
#include "src/Insight/InsightSignals.hpp"
#include "src/Logger/Logger.hpp"
2021-04-04 21:04:12 +01:00
namespace Bloom
{
using namespace Bloom::Exceptions;
using Bloom::Targets::TargetState;
2021-04-04 21:04:12 +01:00
void InsightWorker::startup() {
auto* insightSignals = InsightSignals::instance();
QObject::connect(
insightSignals,
&InsightSignals::taskQueued,
this,
&InsightWorker::executeTasks,
Qt::ConnectionType::QueuedConnection
);
QObject::connect(
insightSignals,
&InsightSignals::taskProcessed,
this,
&InsightWorker::executeTasks,
Qt::ConnectionType::QueuedConnection
);
2022-09-14 19:46:16 +01:00
Logger::debug("InsightWorker" + std::to_string(this->id) + " ready");
emit this->ready();
}
2023-03-13 00:45:26 +00:00
void InsightWorker::queueTask(const QSharedPointer<InsightWorkerTask>& task) {
task->moveToThread(nullptr);
2021-04-04 21:04:12 +01:00
InsightWorker::queuedTasksById.accessor()->emplace(task->id, task);
2023-03-13 00:45:26 +00:00
emit InsightSignals::instance()->taskQueued(task);
}
2021-05-30 16:53:24 +01:00
void InsightWorker::executeTasks() {
static const auto getQueuedTask = [] () -> std::optional<QSharedPointer<InsightWorkerTask>> {
auto queuedTasks = InsightWorker::queuedTasksById.accessor();
if (!queuedTasks->empty()) {
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
const auto canExecuteTask = [&taskGroupsInExecution] (const QSharedPointer<InsightWorkerTask>& task) {
2023-03-15 20:15:05 +00:00
for (const auto taskGroup : task->taskGroups()) {
if (taskGroupsInExecution->contains(taskGroup)) {
return false;
}
}
return true;
};
for (auto [queuedTaskId, task] : *queuedTasks) {
if (canExecuteTask(task)) {
2023-03-15 20:15:05 +00:00
const auto taskGroups = task->taskGroups();
taskGroupsInExecution->insert(taskGroups.begin(), taskGroups.end());
queuedTasks->erase(queuedTaskId);
return task;
}
}
}
return std::nullopt;
};
auto queuedTask = std::optional<QSharedPointer<InsightWorkerTask>>();
while ((queuedTask = getQueuedTask())) {
auto& task = *queuedTask;
task->moveToThread(this->thread());
task->execute(this->targetControllerService);
{
auto taskGroupsInExecution = InsightWorker::taskGroupsInExecution.accessor();
2023-03-15 20:15:05 +00:00
for (const auto& taskGroup : task->taskGroups()) {
taskGroupsInExecution->erase(taskGroup);
}
}
emit InsightSignals::instance()->taskProcessed(task);
}
}
}