Bonjour,

J'ignore comment libérer les ressources d'un objet instancié dynamiquement sur lequel est effectué un moveToThead().
Pour tester et essayer de comprendre j'ai créé un petit projet très simpliste.
Classe A :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef A_H
#define A_H
#include <QObject>
class A : public QObject
{
Q_OBJECT
public:
    A();
    ~A();
public slots:
    void start();
};
#endif // A_H
Classe Thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
class Thread : public QThread
{
Q_OBJECT
public:
    explicit Thread(QObject *parent = 0);
    ~Thread();
    void run();
};
#endif // THREAD_H
Classe Mainwindow générée par défaut à laquelle j'ai ajouté un bouton :
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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
    class MainWindow;
}
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
private slots:
    void on_pushButton_clicked();
};
#endif // MAINWINDOW_H
Quand je clique sur le bouton j'exécute une instance de A dans un nouveau thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
void MainWindow::on_pushButton_clicked()
{
    qDebug() << QThread::currentThreadId() << Q_FUNC_INFO;
 
    Thread* thread = new Thread(this);
    A* a = new A();
 
    a->moveToThread(thread);
    a->connect(thread, SIGNAL(started()), SLOT(start()));
 
    thread->start();
}
Je donne un parent au thread avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Thread* thread = new Thread(this);
pour libérer correctement les ressources de Thread quand son parent Mainwindow meurt.
Mais je ne peux pas donner de parent à A, car c'est incompatible avec moveToThread.
Du coup quand je ferme l'application, le destructeur de Thread est appelé, mais pas celui de A.
Je le sais car j'ai mis des debug de partout dans A et Thread :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
#include "a.h"
#include <QDebug>
#include <QThread>
 
A::A() : QObject()
{ qDebug() << QThread::currentThreadId() << Q_FUNC_INFO; }
 
A::~A()
{ qDebug() << QThread::currentThreadId() << Q_FUNC_INFO; }
 
void A::start()
{ qDebug() << QThread::currentThreadId() << Q_FUNC_INFO; }
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
#include "thread.h"
#include <QDebug>
 
Thread::Thread(QObject *parent) :
    QThread(parent)
{ qDebug() << QThread::currentThreadId() << Q_FUNC_INFO; }
 
Thread::~Thread()
{
    quit();
    wait();
    qDebug() << QThread::currentThreadId() << Q_FUNC_INFO << "apres quit() et wait()";
}
 
void Thread::run()
{
    qDebug() << QThread::currentThreadId() << Q_FUNC_INFO;
    exec();
}
Et le qDebug() de A::~A() ne s'affiche pas.
Comment faire en sorte de bien libérer la mémoire de A ?

Je vous remercie pour vos conseils.