2010-11-15 24 views
1

J'ai une application MFC GUI qui a plusieurs cadres (comme le comportement Outlook'ish avec la fenêtre principale, et les fenêtres de message/rendez-vous étant créés dans de nouveaux cadres, ou Skype comme multi synchronisation de trame), et j'ai besoin de PostMessage malloc'ed données à travers la hiérarchie de la fenêtre. Dites, j'obtiens la chaîne, _wcsdup it, PostMessage (WM_NEWSTRING, ...), et, le contrôle au fond de la hiérarchie la traite, ou s'il n'y a pas d'abonnés, le message get est nettoyé. Ce que je regarde maintenant, c'est que tous les messages sont postés dans le thread d'application, le thread trouve le cadre actif ou le cadre le mieux adapté, passe le message, le cadre passe le message à sa vue, la vue passe le message à subview et ainsi de suite, s'il n'y a pas de vue pour traiter le message, il est gratuit.Comment concevoir une chaîne PostMessage plus propre dans WinApi/MFC

Le problème est que ces commandes de chaînage sont assez fatigantes à écrire, car je dois dupliquer le code de transfert de message dans chaque classe CWnd que j'ai. Dans le même temps, le nettoyage des ressources est assez désagréable, car s'il n'y a pas de fenêtre pour attraper le message, quelqu'un doit appeler le gratuit. Par conséquent, il suffit de poster le message sur le message principal de la pompe sans manipulation supplémentaire, en espérant que quelqu'un l'attrapera toujours, n'est pas une approche valable. PostMessage renvoie S_OK, personne ne voit le message comme traitable, et il est laissé en suspens.

Existe-t-il une meilleure approche pour ce que je cherche?

+1

Il n'y a aucune raison de ne pas simplement utiliser SendMessage, résout trivialement le problème de gestion de la mémoire. Difficile de voir pourquoi vous n'utiliseriez pas simplement un appel de méthode. –

+0

Plusieurs threads ... SendMessage est une sérialisation efficace + un commutateur de contexte. – Coder

+1

Si vous êtes décidé à utiliser cette méthode, pourquoi ne pas ajouter un récepteur de messages à la toute fin de votre chaîne de transmission de message qui nettoiera tout message le rendant si loin? – Jon

Répondre

1

Je n'utiliserais jamais PostMessage comme vous le décrivez. Ma solution implique souvent une poignée de main:

// From CNotifierBlah 
PostMesssage(hWnd, UWM_NEW_DATA, 0, 0); 
// 
LRESULT CDestinationWnd::OnNewData(WPARAM wParam, LPARAM lParam) 
{ 
    CNewData newData = GetNotifierBlah().GetNewData(); // Thread-safe getter! 
} 

A peu près la même chose que Observer pattern.

+0

J'ai eu recours à quelque chose de proche, mais pas exactement à travers les notificateurs. – Coder