文章目录
  1. 1. 单例模式
  2. 2. 全局变量
  3. 3. 多次实例化
  4. 4. 静态变量冲突

单例模式

采用模块化设计思想,把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; //WGS-84系下的经度值,rad
……
};
//采用单例模式构建的全局可见参数
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
//利用模块化思想设计的XX仿真模型
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()形式调用单例全局参数,造成了冲突,从而导致了程序运行结果不符合预期。

如何才能够有效地解决上述冲突,或者有没有什么更优的技术手段,可以回避这个问题。

文章目录
  1. 1. 单例模式
  2. 2. 全局变量
  3. 3. 多次实例化
  4. 4. 静态变量冲突