bonjour,
je m'inspire de l'article: https://mayaposch.wordpress.com/?s=qthread pour écrire une application qui threade.
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, 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
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();
}
Dans ce code, start_thread() est appelée et le slot process() tourne bien dans sa boucle infinie.
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.