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
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 #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; }
Je peux ajouter les .h si vous le souhaitez.
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(); }
Merci de vos commentaires.
> QT 5.13
> QT Creator 4.9.1
Partager