bonjour,
je m'inspire de l'article: https://mayaposch.wordpress.com/?s=qthread pour écrire une application qui threade.
Dans ce code, le signal pour_voir est bien émis puisque le slot voir() est exécuté (un simple cout).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); connect(ui->pushButton_quitter, SIGNAL(clicked(bool)), qApp, SLOT(quit())); connect(ui->pushButton_startThread, SIGNAL(clicked(bool)), this, SLOT(start_thread())); connect(ui->pushButton_stopThread, SIGNAL(clicked(bool)), this, SLOT(stop_thread())); pourVoir = new PourVoir; connect(this, SIGNAL(pour_voir()), pourVoir, SLOT(voir())); emit pour_voir(); }
Dans ce code, start_thread() est appelée et le slot process() tourne bien dans sa boucle infinie.
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 //gestion du clic bouton start_thread void MainWindow::start_thread() { thread = new QThread; worker = new Worker(3); worker->moveToThread(thread); connect(thread, SIGNAL(started()), worker, SLOT(process())); //démarre la fonction de thread connect(worker, SIGNAL(finished()), thread, SLOT(quit())); //qd le worker s'arrête, le thread s'arrête connect(this, SIGNAL(stop_worker()), worker, SLOT(fin())); thread->start(); } //gestion du clic bouton stop_thread void MainWindow::stop_thread() { std::cout << "Stop thread demande" << std::endl; emit stop_worker(); }
Mon problème: quand je clic sur stop_thread, je demande l'émission du signal stop_worker mais je ne rentre jamais dans le slot fin() du worker (où j'ai mis un cout) qui ne s'arrête donc jamais.
Je ne vois pas bien la différence entre l'utilisation des deux emit() si ce n'est que les signaux ne sont pas envoyés vers des objets de même type.
SI quelqu'un a une piste...
Merci.
Partager