Using std::atomic for insight worker task state and progress percentage.

Tidying TaskProgressIndicator widget
This commit is contained in:
Nav
2023-03-18 19:02:15 +00:00
parent 20751b3fb9
commit 3d3d5ab7c1
6 changed files with 48 additions and 20 deletions

View File

@@ -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)
)); ));
} }

View File

@@ -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);
}
} }

View File

@@ -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;

View File

@@ -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)
)); ));
} }

View File

@@ -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);

View File

@@ -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();
}; };
} }