Всем привет. Есть пулл потоков, к примеру их 10 штук. Как сделать так, что по завершению каждого из потоков идёт прибавка в ProgressBar? К примеру есть 10 элементов, на каждый элемент по потоку итого 100/10 каждое завершение потока +10% к progressBar. Как грамотно сделать такой ProgressBar ? Код тестового примера ниже:
Начало всего:
void Calculate::start()
{
QVector<int> elements;
for (int i = 0; i < 100; i++)
{
elements.append(i);
}
QVector<int> KA;
for (int i = 0; i < 10; i++)
{
KA.append(i);
}
for (int i = 0; i < KA.size(); i++)
{
Worker * worker = new Worker(i);
worker->setAutoDelete(false);
worker->setElements(&elements,elements.size());
QThreadPool *threadPool = QThreadPool::globalInstance();
threadPool->setMaxThreadCount(KA.size());
threadPool->start(worker);
}
}
Worker.h
#ifndef WORKER_H
#define WORKER_H
#include <QObject>
#include <QRunnable>
class Worker : public QObject, public QRunnable
{
Q_OBJECT
public:
Worker(int _indexKA);
~Worker();
void setElements(QVector<int> *_elements, int size)
{
elements = _elements;
sizeElements = size;
}
virtual void run();
signals:
private:
int indexKA;
QVector<int> *elements;
int sizeElements;
};
#endif // WORKER_H
Worker.cpp
#include "worker.h"
#include <QDebug>
Worker::Worker(int _indexKA)
{
indexKA = _indexKA;
}
Worker::~Worker()
{
}
void Worker::run()
{
qDebug() << "START";
int summ = 0;
for (int i = 0; i < sizeElements; i++)
{
summ = indexKA + i;
qDebug() << summ;
}
qDebug() << summ;
// здесь как то уведомить поток о завершении и передать 10% в прогресс бар
}
Объявите сигнал о завершении работы воркера (без параметров), этот сигнал принимайте в интерфейсе от каждого из воркеров пула и при поступлении сигнала увеличивайте значение в прогресс-баре на фиксированную величину, рассчитывваемую из количества воркеров. Подразумевается, что количество воркеров известно в том месте, где требуется обновить прогресс-бар.
Сам по себе воркер не должен знать, сколько процентов работы он завершил, так как он ничего не знает о других воркерах.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости