Sasume (./177) :
Le type de message en void *, c’est une mauvaise idée. Le destinataire ne saura pas vraiment quel est le message, à moins de faire de l’introspection, mais c’est généralement une mauvaise idée.
Le truc, c'est que si le destinataire reçoit un void* vers un objet, il saura grâce au m_MsgMain ce dont il s'agit comme objet (m_MsgMain comportant une donnée du genre OBJET_TRUC ou OBJET_MACHIN). Le destinataire saura comment traiter l'objet.
Sasume (./138) :
Une façon simple de faire ça c’est de configurer ton bouton à l’initialisation en lui passant en paramètre l’action à réaliser. Et au moment convenu, le bouton exécutera l’action. Qu’est-ce qu’une Action ? Ça peut être une classe abstraite (ce qu’on appelle une interface en conception objet) qui contient une opération virtuelle pure (abstraite) : execute(). Tu pourras ainsi simplement créer une classe pour chaque action, lui faire implémenter l’opération execute() où tu lui feras faire ce que tu voudras, et ensuite passer une instance de cet classe en paramètre à ton icône, qui se chargera d’appeler sa méthode execute.
Graphiquement, ça donne cette architecture :
Fichier joint :
(action.png)
Ce que je ne comprends pas, c'est le fonctionnement exact. Si je fais exécuter l'action (par exemple, lancement d'un nouveau Module) par l'icone, le TaskManager perd la main sur ce qui se passe, alors que c'est lui qui est censé lancer puis gérer (décharge par exemple) les modules. Si Module1 peut lancer Module2 qui peut lancer Module3 qui peut lancer Module1, je vais avoir une boucle et un enchainement d'objets chargés les uns par dessus les autres.
Si ça passe par le task manager, Module1 demande le chargement de Module2 tout en demandant sa décharge, Module2 demande le chargement de Module3 tout en demandant sa décharge etc... Ca évite l'empilement en mémoire de modules qui n'ont plus rien à y faire.
Sinon, comment une icone de ModuleX peut-elle elle-même décharger le module auquel elle appartient, et donc entrainer sa propre destruction (le destructeur du module provoquant la destruction des objets le contenant), puis lancer un nouveau module ?