Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 !!!!!
smile

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 smile

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 ! smile


Black holes are where god divided by zero...

Hors ligne