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 :
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 :
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 :
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 :
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
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 :
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; } |
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.
Partager