Обновление QProgressBar из нескольких QTHreadsC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обновление QProgressBar из нескольких QTHreads

Сообщение Anonymous »

Я нашел несколько учебных пособий в Интернете, объясняющих, как обновить Qprogressbar во время некоторых длинных расчетов. Одним из них является: используйте Qthread для выполнения расчета, затем издайте сигнал, который связан с ProgressBar.SetValue (int) < /code>. < /P>

Я думал это Должен также работать для нескольких Qthread, которые работают одновременно, но что -то работает неправильно. < /p>

Итак, вот что я делаю: я хочу рассчитать траектории Несколько частиц (каждая с длинной петлей). Чтобы использовать многоядерную обработку, я создаю Qthread для каждой из этих частиц и позволяю ей вызвать соответствующий метод расчета. Это работает нормально, все ядра используются, и расчет заканчивается примерно через четверть времени, чем раньше. .WordPress.com/2011/11/01/HOW-TORLY-TRULY-USE-QTHREADS-THU-FULL-EXPLANATION/. Заголовок выглядит следующим образом:
(worker.h)

Код: Выделить всё

#include 

class Worker: public QObject
{
Q_OBJECT

public:
explicit Worker(World *world = 0, double deltaTau = 0., double maxDist = 0., double iterations = 0., double index = 0);

public slots:
void process();

signals:
void finished();
void eror(QString err);

private:
World *w;
double my_deltaTau;
double my_maxDist;
int my_iterations;
int my_index;
};
< /code>

и источник#include "worker.h"

Worker::Worker(World *world, double deltaTau, double maxDist, double iterations, double index)
{
w = world;
my_deltaTau = deltaTau;
my_maxDist = maxDist;
my_iterations = iterations;
my_index = index;
}

void Worker::process()
{
w->runParticle(my_deltaTau, my_maxDist, my_iterations, my_index);
emit finished();
}
В World.cpp у меня есть функция, запускающую , которая запускает все потоки потоков и функцию runparticle , которая называется работником:

void World::run(double deltaTau, double maxDist, int iterations)
{
globalProgress = 0;
for (int j = 0; j < particles->size(); j++) { //loop over all particles
QThread *thread = new QThread;
Worker *worker = new Worker(this, deltaTau, maxDist, iterations, j);
worker->moveToThread(thread);
connect(thread, SIGNAL(started()), worker, SLOT(process()));
connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
connect(worker, SIGNAL(finished()), thread, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater()));
thread->start();
}
}

void World::runParticle(double deltaTau, double maxDist, int iterations, int index)
{
for (int i = 0; i < iterations; i++) { //loop over iteration steps
if (i % 1000 == 0) { //only update the progress bar every 1000th iteration
emit updateProgress(++globalProgress);
qApp->processEvents(); //

Подробнее здесь: https://stackoverflow.com/questions/241 ... e-qthreads
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»