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 :
Classe Thread :
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 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 #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
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
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
Je donne un parent au thread avec
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(); }pour libérer correctement les ressources de Thread quand son parent Mainwindow meurt.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Thread* thread = new Thread(this);
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; }Et le qDebug() de A::~A() ne s'affiche pas.
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(); }
Comment faire en sorte de bien libérer la mémoire de A ?
Je vous remercie pour vos conseils.
Partager