Bonjour à tous,

Je viens vers vous car je n'ai pas trouvé de réponse à cette question :
  • Comment faire un thread avec un timeout


Après quelques recherches je ne comprend pas pourquoi le code suivant ne fonctionne pas (pourquoi le timeout n'apparait pas).

main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QCoreApplication>
#include "worker.h"
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    Worker worker;
    worker.start();
    worker.wait();
 
    return a.exec();
}
Worker.h
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
#ifndef WORKER_H
#define WORKER_H
 
#include <QObject>
#include <QThread>
 
class QTimer;
 
class Worker : public QThread
{
    Q_OBJECT
 
public:
    Worker(QObject *parent = nullptr);
 
private slots:
    void handlerTimer();
 
protected:
    void run();
 
private:
    QTimer *_timer;
    bool _isFinish;
 
};
 
#endif // WORKER_H
Worker.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
#include "worker.h"
#include <QTimer>
#include <QDebug>
 
Worker::Worker(QObject *parent) :
    QThread(parent),
    _timer(new QTimer()),
    _isFinish(false)
{
    _timer->moveToThread(this);
 
    _timer->setInterval(1000);
    _timer->setSingleShot(true);
    QObject::connect(_timer, &QTimer::timeout, this, &Worker::handlerTimer);
}
 
void Worker::run()
{
    qDebug() << "Debut de la thread";
 
    _timer->start();
 
    int counter = 0;
 
    while(counter < 5 && _isFinish == false)
    {
        counter++;
        qDebug() << "Counter:" << counter;
        this->msleep(500);
    }
 
    qDebug() << "Fin de la thread";
}
 
void Worker::handlerTimer()
{
    _isFinish = true;
    qDebug() << "Timeout";
}
Merci d'avance pour vos réponses.

Cordialement