#1 Le 31/03/2010, à 15:31
- amwus
[RÉSOLU] [QT C++] Problème de double inclusion
Bonjour à tous !
Je suis confronté à un problème assez embarrassant en C++, QT. Voici la situation. J'ai une interface graphique MainWindow qui envoie des signaux à un objet Control, qui gère les différents traitements, dans des threads indépendants si nécessaires.
Donc par exemple, lorsque je clique sur un bouton, je connecte le signal clicked() à un slot de ma classe Control.
Dans la classe Control, le slot en question va démarrer un nouveau thread (si nécessaire) et exécuter son traitement. Le traitement se fait dans un thread indépendant pour ne pas figer l'interface.
L'idée est que, lorsque le traitement est terminé, le thread envoie un signal à MainWindow lui spécifiant que le traitement est terminé et donc que de nouvelles données sont disponibles.
Cela permettrait ainsi de séparer complètement l'interface du traitement.
Oui mais j'ai un problème ! Dans MainWindow, j'ai besoin de Control, et dans Control, j'ai besoin de MainWindow (pour y envoyer des signaux).
Donc évidemment dans MainWindow, j'ai un #include "control.h" et dans Control, j'ai #include "MainWindow.h". Et le compilateur n'aime pas ça du tout...
Du coup je suis assez embêté... Je ne vois pas trop comment sortir de cette impasse. J'ai vraiment besoin que les traitements s'effectuent dans un thread indépendant, donc je ne peux pas me permettre dans l'interface d'attendre que le traitement soit terminé. D'où l'idée des signaux...
Auriez vous une solution à ce problème ?
Merci !!!!!
Dernière modification par amwus (Le 01/04/2010, à 07:57)
Black holes are where god divided by zero...
Hors ligne
#2 Le 31/03/2010, à 15:40
- yohann
Re : [RÉSOLU] [QT C++] Problème de double inclusion
est ce que tes fichier .h sont protégér contre la double inclusion?
#ifndef ___FILE_H___
# define ___FILE_H___
ton fichier
#endif
ça devrait suffire j'espère
j.vachez, le génie du net | Soirées jeux sur Lyon | 441
++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.
Hors ligne
#3 Le 31/03/2010, à 17:09
- amwus
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Oui, tous mes fichiers .h sont protégés de cette façon... Par défaut, tous j'inclus cette protection...
Black holes are where god divided by zero...
Hors ligne
#4 Le 31/03/2010, à 18:24
- omc
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Bonjour,
Pour ce protéger de ce problème il y a aussi les forward declaration
Hors ligne
#5 Le 31/03/2010, à 20:52
- amwus
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Oui mais malheureusement dans mon cas ça ne peut pas fonctionner. Néanmoins, j'ai réfléchi une structure différente pour mon programme. En utilisant le pattern Observer, je devrais pouvoir arriver à mes fins... J'essaierai ça demain !
Black holes are where god divided by zero...
Hors ligne
#6 Le 31/03/2010, à 21:46
- obiwankennedy
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Si tu déclares ton instance de control dans la mainwindow, tu peux faire autant de connect que tu veux entre control et mainwindow. Les signaux emit dans le thread peuvent être intercepter par la classe controle et remit par contrôle:
//dans controle:
connect(thread,signal(traitementFin()), this,signal(traitementFini()));
//dans mainwindow
connect(control,signal(traitementFini()), this , SLOT(refreshDataBecauseTraitementFini());
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#7 Le 31/03/2010, à 22:15
- amwus
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Je ne comprend pas très bien... Voici une interraction typique de mon système :
MainWindow envoie un signal à Control pour démarrer un traitement. Donc dans MainWindow, j'ai
connect(button, SIGNAL(clicked()), control, SLOT(slot_traitement()));
Le slot en question démarre un traitement dans un thread indépendant, pour éviter de figer l'interface, une fois que le thread a terminé il va effectivement envoyer un signal de terminaison à Control, mais il faut encore que Control relaie l'info à l'interface graphique, donc que j'ai un
connect(this, SIGNAL(notify_update()), MainWindow, SLOT(slot_update()));
dans la classe Control. Typiquement, cela permet à l'interface graphique d'aller alors rechercher l'information résultante du traitement...
Or nécessairement, ça implique que Control ait une référence vers MainWindow et inversement, non ?
En utilisant le pattern Observer, je peut contourner ça en utilisant des interfaces, mais s'il y a plus simple, je prend !
Merci pour toutes vos réponses
Dernière modification par amwus (Le 31/03/2010, à 22:16)
Black holes are where god divided by zero...
Hors ligne
#8 Le 31/03/2010, à 23:18
- obiwankennedy
Re : [RÉSOLU] [QT C++] Problème de double inclusion
cette ligne peut tout à fait être dans la classe de la mainwindow (en remplacant quelque truc)
connect(this, SIGNAL(notify_update()), MainWindow, SLOT(slot_update()));
devient
connect(control, SIGNAL(notify_update()), this, SLOT(slot_update()));
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#9 Le 31/03/2010, à 23:41
- amwus
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Ha bon ! Ça voudrait dire qu'un objet peut alors écouter réellement un signal provenant d'un autre ? Mais c'est superbe ça ! J'avoue que je débute en QT, je ne savais pas que c'était possible...
Dans ce cas, pas besoin de référence à MainWindow dans Control alors ? Il suffirait d'émettre le signal et automatiquement, MainWindow le récupérerait ?
Black holes are where god divided by zero...
Hors ligne
#10 Le 01/04/2010, à 06:38
- obiwankennedy
Re : [RÉSOLU] [QT C++] Problème de double inclusion
C'est ça.
Dans mes logiciels, j'écris ton nom.
SGNGD: SvgGd is Not GD
Rolisteam
Hors ligne
#11 Le 01/04/2010, à 07:56
- amwus
Re : [RÉSOLU] [QT C++] Problème de double inclusion
Effectivement, ça fonctionne très bien ! Merci merci ! C'est impressionnant de voir la simplicité avec laquelle on crée des connections avec QT. Mettre en place une architecture MVC avec ce framework est vraiment simple et efficace...
Merci encore !
Black holes are where god divided by zero...
Hors ligne