单例模式
采用模块化设计思想,把XX仿真模型拆分成了若干个分系统,在每个分系统中可能都会使用到初始化参数(即INITPATAM),所以用单例模式构建了一个“全局可见、全局唯一”的参数集合(除了INITPATAM外,还包含其它很多公共参数,不再赘述),同时为了进一步提升安全性,采用了操作接口(即Set/Get函数),如下面的代码段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| struct INITPATAM { double Longitude; …… }; class GlobalParam { public: virtual ~GlobalParam(); static GlobalParam* Instance(); void SetInitParam(const INITPATAM& _param) {param = _param;} void GetInitParam(INITPATAM& _param) {_param = param;} …… protected: GlobalParam(); private: static GlobalParam* _state; INITPATAM param; …… }
|
全局变量
在上述仿真模型的初始化函数中,完成全局变量设置;在时间迭代步进操作中,其它的子系统调用了该全局可见参数,即:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class CAntenna; class RADAR_API RADARDLL { public: RADARDLL(); …… virtual ~RADARDLL(); bool Initialize(const INITPATAM& param) { GlobalParam::Instance()->SetInitParam(param); …… return true; } void Advance(); protected: …… private: CAntenna* m_Antenna; …… }; void RADARDLL::Advance() { m_Antenna->Advance(); } void CAntenna::Advance() { INITPATAM InitParam; GlobalParam::Instance()->GetInitParam(InitParam); …… }
|
多次实例化
设计外部应用程序,调用上述设计的RADARDLL仿真模型,因为考虑了多个对象,所以进行了多次示例化,它们具有不同的初始化参数,即
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| UINT SimMainProc(LPVOID param) { INITPATAM *InitParam = (INITPATAM*)param; RADARDLL *pRadar = new RADARDLL(); pRadar->Initialize(); …… pRadar->Advance(); if(NULL != pRadar) { delete pRadar, pRadar = NULL; } return 0; } void RadarSimDemo::OnSimBegin() { #define RADARNUM 2 …… INITPATAM Param1; …… INITPATAM Param2; …… CWinThread* Radar1Thread = AfxBeginThread(SimMainProc, (LPVOID)&Param1, THREAD_PRIORITY_BELOW_NORMAL, 0, CREATE_SUSPENDED); …… Radar1Thread->ResumeThread(); CWinThread* Radar2Thread = AfxBeginThread(SimMainProc, (LPVOID)&Param2, THREAD_PRIORITY_BELOW_NORMAL, 0, CREATE_SUSPENDED); …… Radar2Thread->ResumeThread(); …… }
|
静态变量冲突
问题出现了:由于RADARDLL仿真模型中的单例全局参数中含有静态变量,而在RADARDLL仿真模型的内部子系统中均是采用同样的GlobalParam::Instance()形式调用单例全局参数,造成了冲突,从而导致了程序运行结果不符合预期。
如何才能够有效地解决上述冲突,或者有没有什么更优的技术手段,可以回避这个问题。