Bonjour,
ma question n'a probablement pas sa place ici, mais vu que j'aime bien le forum
En fait, je sollicite votre aide/vos idées pour un point de mon programme qui me chagrine.
Je vous exlique le schmilblik :
- J'ai une application Qt qui sert d'IHM client pour interfacer une machine
- La machine est branchée à un serveur (pas fait avec Qt) dont le développement est effectué par un collègue.
- depuis l'IHM je peux demander tout un tas d'actions différentes à la machine, certaines étant bloquantes, d'autres non, ça dépend du temps que ça prend.
Exemple : 2 actions :
- allumer la lumière (très rapide)
- faire tourner les moteurs pendant un certain temps (un certain temps
)
voilà, le contexte étant posé, je décris brièvement comment se passe une action :
- Chaque action particulière est effectuée depuis une fenêtre associée.
- je clique sur menu>lumière, une nouvelle fenêtre avec des paramètres variés (comme la lumière à activer, puissance ...) apparaît.
- Sur cette même fenêtre, j'ai un QTextEdit, qui sert de 'log' (ex. : "commande envoyée", "commande refusée" ...).
- Je fais mes réglages et je clique "envoyer demande", la trame de commande par au serveur, qui dans ce cas (lumière) me répond instantannément, du coup j'affiche dans le log ce que répond le serveur (un "acknowledge" pour le moment).
Le problème :
- pour une action plus longue (les moteurs), le serveur acknowledges tout de suite, et l'action s'effectue dans un thread au niveau du serveur.
- moi, je veux fermer ma fenêtre et pouvoir faire autre chose en attendant.
- J'aimerais que - lorsque le serveur a fini - il envoie une trame contenant un message, et que le fameux routeur sache à quelle fenêtre de mon programme rediriger ce message. La fenêtre en question se contentera d'ajouter le message dans le log, même si elle n'est pas en avant plan.
voilà donc en résumé mon problème avec quelques précisions :
- la classe contenant les objets de communication (un pour envoyer et un pour recevoir) est à instance unique (j'ai pas encore de singleton, pour le moment, je sais que je ne fais qu'une instance, et je véhicule le pointeur aux classes qui en ont besoin (c'est crade je sais
))
- Rediriger une trame à un destinataire précis (souvent une fenêtre)
Mes pistes :
- L'application instancie la communication, avec le QTcpSocket pour envoyer, et le QTcpServer pour recevoir.
- Chaque nouvelle classe (dialogue ou fenêtre la plupart du temps) susceptible de recevoir des informations provenant du serveur demande à l'application de l'ajouter dans une liste d'éléments communiquants en lui fournissant un identifiant unique (pourquoi pas la valeur de son pointeur this).
- Ensuite, chaque fois qu'une fenêtre communiquante envoie une requête, elle joint son identifiant dans la trame pour que le serveur puisse remettre cet ID dans sa trame de réponse plus tard.
- Lors d'une réponse, l'application examine l'ID dans la trame, et envoie un signal à l'objet @ID avec le contenu de la trame.
Comment pourrais-je faire ça au mieux, en evitant que chaque fenêtre/dialogue ne s'amuse à vérifier si le message lui est bien destiné ?
voilà, merci pour ceux qui ont lu jusque là ou même rien que jusqu'à la moitié![]()
Partager