最近做的一个项目,由于工程需要模块之间能够互相通信,但又不想模块之间耦合度太高
使用信号槽的话,需要两个类的对象或者指针在其中一个类都要体现,这样达不到效果,
想要一个管理类对这些互相通信的类之间进行管理,只需要在各自的类注册发送者和接收者即可,双方通过一个指定的消息ID来建立联系。
技术:QObject::connect()定义map来管理发送方和接收方
上代码
头文件
#pragma once
#include "messager_global.h"
 #include "GlobalDefines.h"
 #include "QObject"
 #include "Platform\OSAdapter\VAZLock.h"
 #include "Messager.h"
class CMsgObj
 {
 public:
     CMsgObj(QObject* MsgObj, const tchar* pszMsgObjName, const char* pszMethodName, Qt::ConnectionType connectyType)
     {
         m_MsgObj = MsgObj;
         m_sMsgObjName = pszMsgObjName;
         m_sMethodName = pszMethodName;
         m_connectionType = connectyType;
     };
    QObject* m_MsgObj;
     tstring m_sMsgObjName;
     string    m_sMethodName;
     Qt::ConnectionType m_connectionType;
public:
     inline bool operator == (const CMsgObj& rt) const
     {
         return (rt.m_MsgObj == m_MsgObj)
             && (rt.m_sMethodName == m_sMethodName);
     }
 };
class CVAZMessager : public QObject
 {
     Q_OBJECT
 public:
     CVAZMessager();
     ~CVAZMessager();
     static CVAZMessager& Instance();
    void RegisterReceiver(VAZ_MSG_ID MsgID, QObject* Receiver, const tchar* pszReceiverName, const char* pszMethodName);
     void UnregisterReceiver(VAZ_MSG_ID MsgID, QObject* Receiver, const tchar* pszReceiverName, const char* pszMethodName);
    void RegisterSender(VAZ_MSG_ID MsgID, QObject* Sender, const tchar* pszSenderName, const char* pszMethodName, Qt::ConnectionType connectionType);
     void UnregisterSender(VAZ_MSG_ID MsgID, QObject* Sender, const tchar* pszSenderName, const char* pszMethodName);
     bool IsSignalRegistered(VAZ_MSG_ID MsgID, QObject* Sender);
private:
     map< VAZ_MSG_ID, list< CMsgObj> > m_mapReceivers;
     map< VAZ_MSG_ID, list< CMsgObj> > m_mapSenders;
     typedef map< VAZ_MSG_ID, list< CMsgObj> >::iterator IterReceivers, IterSenders;
     typedef list< CMsgObj>::iterator IterReceiver, IterSender;
     CVAZLock m_MessagerLock;
 };
 cpp文件
#include "VAZMessager.h"
 #include "Platform\Logger\Logger.h"
 #include "..\Common\misc.h"
CVAZMessager::CVAZMessager()
     : QObject()
     , m_MessagerLock(_T("Messager Lock"))
 {
 }
CVAZMessager::~CVAZMessager()
 {
 }
CVAZMessager & CVAZMessager::Instance()
 {
     static CVAZM