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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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