在单例中少用static的解决方案

    由于单例和static在内存中的存放位置不一样,而有些应用不管是使用单例还是使用static都是为了共用某个成员,如果混合使用,比如单例里面又使用了static,就会导致某些成员不能保持一致。

最好的解决方案是如果使用了单例,那么单例里成员就不要再使用static,也不要使用static的全局变量。但是如果我设计这个class时还不确定是否使用单例,那可以使用static,只是单例时不使用这个static成员即可。

 

原有流程:

<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1025" DrawAspect="Content" ObjectID="_1437833746"> </o:OLEObject> </xml><![endif]-->



 

改造后流程:

<!--[if gte mso 9]><xml> <o:OLEObject Type="Embed" ProgID="Visio.Drawing.11" ShapeID="_x0000_i1026" DrawAspect="Content" ObjectID="_1437833748"> </o:OLEObject> </xml><![endif]-->



 

 

DetailbillMgr.h,增加成员变量m_AltibaseIntf

classDetailbillMgr

{

public:

    DetailbillMgr()

    {

        m_AltibaseIntf = NULL;

    }

protected:// 改为private

    abdb::AltibaseIntf * m_AltibaseIntf;

};

 

DetailbillMgr.cpp,原来abdbi指向一个staticAltibaseIntf,改为指向DetailbillMgr的成员变量

abdb::AltibaseIntf * abdbi;

if(m_AltibaseIntf==NULL)

{

    m_AltibaseIntf = new abdb::AltibaseIntf;

}

m_AltibaseIntf =  abdb::connectAltibase(m_AltibaseIntf);

abdbi = m_AltibaseIntf;

 

改造前:

abdb::AltibaseIntf * abdbi = abdb::AltibaseIntf::getInstance();

abdbi =  abdb::connectAltibase(abdbi);

 

AltibaseIntf.hAltibaseIntf增加成员变量curTimeStamp,取代原有的static全局变量

classAltibaseIntf {

public:

    stringcurTimeStamp; 

};

 

AcctConnection.cpp,把原有的static变量curTimeStamp注释掉,采用新加的成员变量curTimeStamp

//当前时间戳

//static string curTimeStamp("");

if(handle->curTimeStamp < timeStamp)

{

    handle->disConnect();

    handle->setConnInfo(abdbUser, abdbPassWd, abdbDsn, abdbPort);

    handle->connect();

    handle->curTimeStamp = timeStamp;

}

 

改造后,用tuxedo单个测试,调用了5次没问题,第一次连接数据库,后面四次都不连接数据库。

用批量并发测试,tuxedo进程自增长后不报错,降落后也不报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个功能强大的C++跨平台应用程序开发框架。Qt提供了模式的实现方法,在Qt实现一个需要使用Q_GLOBAL_STATIC宏来创建,并使用connect()连接信号和槽。 全局信号是指可以被应用程序的任何对象接收的信号。由于应用程序的对象可以在应用程序的不同线程运行,因此使用模式实现全局信号是一个很好的解决方案模式是一种创建个实的方式,确保只有一个实被创建并在应用程序的整个生命周期使用。Qt使用Q_GLOBAL_STATIC宏定义,该宏的第一个参数是类的类型。 如,下面的代码定义了一个名为MySingleton的类: ``` class MySingleton { public: static MySingleton* getInstance(); private: MySingleton(); Q_DISABLE_COPY(MySingleton) }; MySingleton *MySingleton::getInstance() { static const QScopedPointer<MySingleton> instance(new MySingleton()); return instance.data(); } typedef QGlobalStatic<MySingleton> MySingletonPtr; Q_GLOBAL_STATIC(MySingletonPtr, mySingleton) ``` 全局信号可以使用Qt的QObject类来实现。QObject类定义了signal和slot,可以在应用程序的不同对象之间传递消息和数据。 为了实现全局信号,可以在添加一个QObject对象,并在其定义信号和槽。在接收信号的对象,可以使用connect()函数将对象的槽函数连接到全局信号。 如,下面的代码向MySingleton类添加了一个QObject对象,并定义一个全局信号: ``` class MySingleton : public QObject { public: static MySingleton* getInstance(); signals: void mySignal(); private: MySingleton(); Q_DISABLE_COPY(MySingleton) }; MySingleton *MySingleton::getInstance() { static const QScopedPointer<MySingleton> instance(new MySingleton()); return instance.data(); } typedef QGlobalStatic<MySingleton> MySingletonPtr; Q_GLOBAL_STATIC(MySingletonPtr, mySingleton) MySingleton::MySingleton() : QObject() {} ``` 现在,就可以在应用程序的其他对象接收全局信号: ``` MySingleton::getInstance()->emit mySignal(); ``` 可以将mySignal()信号连接到任何具有匹配参数的槽函数: ``` connect(MySingleton::getInstance(), &MySingleton::mySignal, this, &MyObject::mySlot); ``` 使用模式和QObject类,Qt可以非常方便地实现全局信号。通过这种方式,任何对象都可以接收应用程序发生的事件,从而更加灵活和可扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值