Mon code est-il correct ?
Bonjour,
Je suis en train de tester l'utilisation de QThread avec QT pour utiliser ce fonctionne dans une application dans laquelle j'aurais plusieurs traitements longs à faire.
J'ai fait un code qui fonctionne, mais je voulais savoir, si c'était la bonne manière de procéder.
mytraitment.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <QMutexLocker>
#include "mytraitment.h"
MyTraitment::MyTraitment(int size, QObject *parent) : QThread(parent)
{
this->m_size = size;
this->m_stop = false;
}
MyTraitment::~MyTraitment()
{
// traitement ?
}
void MyTraitment::run()
{
int val = 0;
this->m_stop = false;
bool isCancel = false;
while(true)
{
val++;
if (val > this->m_size)
break;
QMutexLocker locker(&this->m_mutex);
if (this->m_stop)
{
isCancel = true;
break;
}
sleep(1);
emit this->processTraitment("", val);
}
if (isCancel)
emit this->cancelTtraitment();
else
emit this->finishedTtraitment();
}
void MyTraitment::stop()
{
QMutexLocker locker(&this->m_mutex);
this->m_stop = true;
} |
mainwindows.cpp
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include "mainwindow.h"
#include "ui_mainwindow.h"
const int NB_TRAIT = 20;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->btnStop->setEnabled(false);
ui->progressBar->setValue(0);
this->trait = new MyTraitment(NB_TRAIT, this);
connect(trait, &MyTraitment::processTraitment, this, &MainWindow::TraitOne);
connect(trait, &MyTraitment::finishedTtraitment, this, &MainWindow::FinishTrait);
connect(trait, &MyTraitment::cancelTtraitment, this, &MainWindow::CancelTrait);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::TraitOne(const QString &str, int val)
{
ui->lblValue->setText(QString::number(val));
double d((double(val) / double(NB_TRAIT)) * 100);
ui->progressBar->setValue(int(d));
}
void MainWindow::FinishTrait()
{
ui->btnStop->setEnabled(false);
ui->progressBar->setValue(100);
}
void MainWindow::CancelTrait()
{
ui->btnStop->setEnabled(false);
ui->lblValue->setText("Cancel");
}
void MainWindow::on_btnTraitment_clicked()
{
ui->btnStop->setEnabled(true);
this->trait->start();
}
void MainWindow::on_btnStop_clicked()
{
trait->stop();
} |
Je peux ajouter les .h si vous le souhaitez.
Merci de vos commentaires.
> QT 5.13
> QT Creator 4.9.1