Non seul le thread touche à la FIFO au début pour y ajouter le buffer et fait un pop() pour retirer l'objet et le détruire.
J'ai fais une classe héritée de QThread pour héberger mes QObject.
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 #ifndef THREADHOUSE_HXX #define THREADHOUSE_HXX #include <QThread> #include "application.hxx" class Application; class AcquiThread : public QThread { Q_OBJECT private: Application * parent; public: AcquiThread(Application *, QObject *); ~AcquiThread(); protected: void run(); }; #endif // ACQUITHREAD_HXXcela te parait bon ?
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 #include "acquithread.hxx" #include "application.hxx" AcquiThread::AcquiThread(Application * _parent, QObject * guest) : parent(_parent) { /* ------ Assignation des objets ----- */ //Les objets vivent maintenant dans ce thread guest->moveToThread(this); } AcquiThread::~AcquiThread() {} void AcquiThread::run() { exec(); }
si la FIFO est accédé par un seule thread, y as pas besoin de mutex.
Par contre si tu le détruit, les slot récepteur vont se retrouver avec un pointeur invalide et crasher ton appli :/
Le top c’est de mettre tes objet popé dans un QSharedPointeur et c'est ce que tu envoye. Là plus de problème sur le delete, il se fera automatiquement.
oui.
Pas besoin de réimplémenter le run, c'est déjà ce qu'il fait
Si c'est intéressant, tu peut aussi instancier tes QObject dans le run. Comme cela il n'y as pas besoin de moveToThread.
Dans la plupart des cas, je ne reimplémente pas QThread. Je l'utilise telle quel.
J'utilise alors moveToTHread pour déplacer certain QObject dans un thread précis pendant l'éxécution.
Ok je vois. Merci pour tes infos
Maintenant passons à autre chose :p
Je viens de faire le tour de toutes mes lignes de code à la recherche d'une éventuelle fuite de mémoire.
Tous mes destructeurs suppriment les objets instanciés dynamiquement.
Tous mes pointeurs sont détruis à la fin.
Mais seulement j'ai surveillé la mémoire que pompe le logiciel en stress test (simulation d'acquisitions de 20 impulsions à la suite) et j'ai remarqué que la taille augmentait au fur et à mesure.
D'un côté c'est normal vu que l'interface graphique (QTableWidget) ajoute une ligne d'informations par impulsion (donc 20 à chaque lancement).
Ce que je comprend moins, c'est pourquoi la taille redescend de façon peu significative lorsque je supprime la totalité du contenu de ce QTableWidget avec removeRow(int).
De plus à chaque appel de setStatusTip() sur mon QMainWindow je vois la taille augmenter, mais jamais diminuer ..
Idem pour mon setStatusBar() dans lequel vis un QLabel, sur lequel je fais un setText().
EDIT: Dans la statusBar il y a un QLabel sur lequel je fais un setText().
Augemente de quelle manière?
Beaucoup? Un peu?
Faut faire attention à l'interprétation de ce que te fournie windows
Quand je lance une simulation de 20 impulsion, je vois une augmentation de 400ko, des fois 200ko, des fois moins, des fois plus, ça varie.
Parcontre que je removeRow(), aucun changement ..
J'ai remarqué que passer du mode Debug au mode Release faisait diminuer la taille du processus de 10Mo.
Les memory leaks sont d'autant plus dangereux que le logiciel que je programme va tourner sur une machine h24/7 pendant plusieurs semaines d'affilés, sans nettoyage ni rien.
Il s'agit en faite de mon projet de fin de licence. Je programme un logiciel d'acquisition de signaux électromagnétiques liés à la foudre. Lui se base sur ces données pour faire ses recherches, et il fera tourner ce logiciel sur 3 machines, géographiquement éloignées, sans accès à distance, sans accès quotidien possible.
Et pour gratiner le tout, il utilise une vieille daube en P4 1Go DDR2 sous XP ..
As tu essayé de le faire tourner plusieur heure et voir si la mémoire stagne?
J'utilise Qt Creator et je code en C++ le plus optimisé possible.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager