Using std::atomic for insight worker task state and progress percentage.
Tidying TaskProgressIndicator widget
This commit is contained in:
@@ -68,7 +68,7 @@ namespace Bloom
|
|||||||
);
|
);
|
||||||
|
|
||||||
std::move(dataSegment.begin(), dataSegment.end(), std::back_inserter(*this->data));
|
std::move(dataSegment.begin(), dataSegment.end(), std::back_inserter(*this->data));
|
||||||
emit this->progressUpdate(static_cast<int>(
|
this->setProgressPercentage(static_cast<std::uint8_t>(
|
||||||
(static_cast<float>(i) + 1) / (static_cast<float>(readsRequired + 1) / 100)
|
(static_cast<float>(i) + 1) / (static_cast<float>(readsRequired + 1) / 100)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,11 @@ namespace Bloom
|
|||||||
try {
|
try {
|
||||||
this->state = InsightWorkerTaskState::STARTED;
|
this->state = InsightWorkerTaskState::STARTED;
|
||||||
emit this->started();
|
emit this->started();
|
||||||
|
|
||||||
this->run(targetControllerService);
|
this->run(targetControllerService);
|
||||||
|
|
||||||
this->state = InsightWorkerTaskState::COMPLETED;
|
this->state = InsightWorkerTaskState::COMPLETED;
|
||||||
|
this->setProgressPercentage(100);
|
||||||
emit this->completed();
|
emit this->completed();
|
||||||
|
|
||||||
} catch (std::exception& exception) {
|
} catch (std::exception& exception) {
|
||||||
@@ -26,4 +29,9 @@ namespace Bloom
|
|||||||
|
|
||||||
emit this->finished();
|
emit this->finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InsightWorkerTask::setProgressPercentage(std::uint8_t percentage) {
|
||||||
|
this->progressPercentage = percentage;
|
||||||
|
emit this->progressUpdate(this->progressPercentage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ namespace Bloom
|
|||||||
COMPLETED,
|
COMPLETED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static_assert(std::atomic<InsightWorkerTaskState>::is_always_lock_free);
|
||||||
|
static_assert(std::atomic<std::uint8_t>::is_always_lock_free);
|
||||||
|
|
||||||
class InsightWorkerTask: public QObject
|
class InsightWorkerTask: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -25,7 +28,8 @@ namespace Bloom
|
|||||||
public:
|
public:
|
||||||
using IdType = std::uint64_t;
|
using IdType = std::uint64_t;
|
||||||
const InsightWorkerTask::IdType id = ++(InsightWorkerTask::lastId);
|
const InsightWorkerTask::IdType id = ++(InsightWorkerTask::lastId);
|
||||||
InsightWorkerTaskState state = InsightWorkerTaskState::CREATED;
|
std::atomic<InsightWorkerTaskState> state = InsightWorkerTaskState::CREATED;
|
||||||
|
std::atomic<std::uint8_t> progressPercentage = 0;
|
||||||
|
|
||||||
InsightWorkerTask();
|
InsightWorkerTask();
|
||||||
|
|
||||||
@@ -55,7 +59,7 @@ namespace Bloom
|
|||||||
* @param progressPercentage
|
* @param progressPercentage
|
||||||
* The task's current progress.
|
* The task's current progress.
|
||||||
*/
|
*/
|
||||||
void progressUpdate(int progressPercentage);
|
void progressUpdate(std::uint8_t progressPercentage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The InsightWorkerTask::completed() signal will be emitted once the task has successfully completed.
|
* The InsightWorkerTask::completed() signal will be emitted once the task has successfully completed.
|
||||||
@@ -76,6 +80,7 @@ namespace Bloom
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void run(Services::TargetControllerService& targetControllerService) = 0;
|
virtual void run(Services::TargetControllerService& targetControllerService) = 0;
|
||||||
|
void setProgressPercentage(std::uint8_t percentage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static inline std::atomic<InsightWorkerTask::IdType> lastId = 0;
|
static inline std::atomic<InsightWorkerTask::IdType> lastId = 0;
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ namespace Bloom
|
|||||||
);
|
);
|
||||||
|
|
||||||
std::move(dataSegment.begin(), dataSegment.end(), std::back_inserter(data));
|
std::move(dataSegment.begin(), dataSegment.end(), std::back_inserter(data));
|
||||||
emit this->progressUpdate(static_cast<int>(
|
this->setProgressPercentage(static_cast<std::uint8_t>(
|
||||||
(static_cast<float>(i) + 1) / (static_cast<float>(readsRequired) / 100)
|
(static_cast<float>(i) + 1) / (static_cast<float>(readsRequired) / 100)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,16 +20,23 @@ namespace Bloom::Widgets
|
|||||||
|
|
||||||
QObject::connect(
|
QObject::connect(
|
||||||
this->task.get(),
|
this->task.get(),
|
||||||
&InsightWorkerTask::progressUpdate,
|
&InsightWorkerTask::started,
|
||||||
this,
|
this,
|
||||||
&TaskProgressIndicator::onTaskProgressUpdate
|
&TaskProgressIndicator::onTaskStateChanged
|
||||||
|
);
|
||||||
|
|
||||||
|
QObject::connect(
|
||||||
|
this->task.get(),
|
||||||
|
&InsightWorkerTask::finished,
|
||||||
|
this,
|
||||||
|
&TaskProgressIndicator::onTaskStateChanged
|
||||||
);
|
);
|
||||||
|
|
||||||
QObject::connect(
|
QObject::connect(
|
||||||
this->task.get(),
|
this->task.get(),
|
||||||
&InsightWorkerTask::failed,
|
&InsightWorkerTask::failed,
|
||||||
this,
|
this,
|
||||||
&TaskProgressIndicator::onTaskFailed
|
&TaskProgressIndicator::onTaskStateChanged
|
||||||
);
|
);
|
||||||
|
|
||||||
QObject::connect(
|
QObject::connect(
|
||||||
@@ -38,6 +45,13 @@ namespace Bloom::Widgets
|
|||||||
this,
|
this,
|
||||||
&TaskProgressIndicator::onTaskFinished
|
&TaskProgressIndicator::onTaskFinished
|
||||||
);
|
);
|
||||||
|
|
||||||
|
QObject::connect(
|
||||||
|
this->task.get(),
|
||||||
|
&InsightWorkerTask::progressUpdate,
|
||||||
|
this,
|
||||||
|
&TaskProgressIndicator::onTaskProgressUpdate
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskProgressIndicator::paintEvent(QPaintEvent* event) {
|
void TaskProgressIndicator::paintEvent(QPaintEvent* event) {
|
||||||
@@ -56,12 +70,20 @@ namespace Bloom::Widgets
|
|||||||
static constexpr auto barHeight = 3;
|
static constexpr auto barHeight = 3;
|
||||||
const auto barYPosition = size.height() - barHeight - 3;
|
const auto barYPosition = size.height() - barHeight - 3;
|
||||||
|
|
||||||
const auto percentage = std::max(this->taskProgressPercentage, 2);
|
const auto percentage = std::max(static_cast<int>(this->task->progressPercentage), 2);
|
||||||
|
|
||||||
|
const auto status = QString(
|
||||||
|
this->task->state == InsightWorkerTaskState::FAILED
|
||||||
|
? " - Failed"
|
||||||
|
: this->task->state == InsightWorkerTaskState::COMPLETED
|
||||||
|
? " - Completed"
|
||||||
|
: ""
|
||||||
|
);
|
||||||
|
|
||||||
painter.drawText(
|
painter.drawText(
|
||||||
0,
|
0,
|
||||||
barYPosition - 5,
|
barYPosition - 5,
|
||||||
this->task->brief() + QString(this->taskFailed ? " - Failed" : (percentage == 100 ? " - Completed" : ""))
|
this->task->brief() + status
|
||||||
);
|
);
|
||||||
|
|
||||||
painter.setPen(Qt::PenStyle::NoPen);
|
painter.setPen(Qt::PenStyle::NoPen);
|
||||||
@@ -84,20 +106,15 @@ namespace Bloom::Widgets
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskProgressIndicator::onTaskProgressUpdate(int taskProgressPercentage) {
|
void TaskProgressIndicator::onTaskProgressUpdate() {
|
||||||
this->taskProgressPercentage = taskProgressPercentage;
|
|
||||||
this->update();
|
this->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskProgressIndicator::onTaskFailed() {
|
void TaskProgressIndicator::onTaskStateChanged() {
|
||||||
this->taskFailed = true;
|
|
||||||
this->update();
|
this->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TaskProgressIndicator::onTaskFinished() {
|
void TaskProgressIndicator::onTaskFinished() {
|
||||||
this->taskProgressPercentage = 100;
|
|
||||||
this->update();
|
|
||||||
|
|
||||||
auto* finishedSignalTimer = new QTimer();
|
auto* finishedSignalTimer = new QTimer();
|
||||||
finishedSignalTimer->setSingleShot(true);
|
finishedSignalTimer->setSingleShot(true);
|
||||||
finishedSignalTimer->setInterval(2500);
|
finishedSignalTimer->setInterval(2500);
|
||||||
|
|||||||
@@ -25,11 +25,9 @@ namespace Bloom::Widgets
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QSharedPointer<InsightWorkerTask> task;
|
QSharedPointer<InsightWorkerTask> task;
|
||||||
int taskProgressPercentage = 0;
|
|
||||||
bool taskFailed = false;
|
|
||||||
|
|
||||||
void onTaskProgressUpdate(int progressPercentage);
|
void onTaskProgressUpdate();
|
||||||
void onTaskFailed();
|
void onTaskStateChanged();
|
||||||
void onTaskFinished();
|
void onTaskFinished();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user