Qt共享内存实现全局资源的封装API

#pragma once
#include <QSharedMemory>
#include <QHash>
#include <QList>
#include <QString>

class GlobalResource;

/*! @brief 全局资源管理
*
* 用于取代单例模式,除init和clean,其它函数由宏调用
* 使用共享内存,可实现自然跨线程使用类静态函数访问资源
* 由于共享内存直接new得,不可跨进程使用
*/
class Global
{
Global();
public:
~Global();
// 初始化
static bool init(QString &errorText);
// 清理内存
static void clean();
// 获取单例
static Global *instance();

// 获取资源
GlobalResource *resource(QString name);
// 资源是否存在
bool containsResource(QString name);
// 添加资源
GlobalResource *addResource(QString name, GlobalResource *res);
private:
QSharedMemory sharedMemory_;
QHash<QString, GlobalResource*> resources_; // 全局资源与名称映射表
QList<GlobalResource *> resourceOrder_; // 全局资源按顺序保存(用于释放)
};

class GlobalResource
{
public:
GlobalResource(){}
virtual ~GlobalResource(){}
virtual void *resource() = 0;
};

template<class T>
class GlobalContainer : public GlobalResource
{
public:
GlobalContainer(T *res) : res_(res) { }
~GlobalContainer() override { delete res_; }
void *resource() override { return reinterpret_cast<void*>(res_); }

private:
T *res_ = nullptr;
};

// 获取全局资源,参数T为类名
template<class T>
T *global()
{
return reinterpret_cast<T*>(Global::instance()->resource(typeid(T).name())->resource());
}

// 初始化全局资源
template<class T>
void globalInit()
{
GlobalResource *res = new GlobalContainer<T>(new T);
Global::instance()->addResource(typeid(T).name(), res);
}

// 初始化全局资源(用于抽象类或其它父类)
template<class T>
void globalInit(T *p)
{
GlobalResource *res = new GlobalContainer<T>(p);
Global::instance()->addResource(typeid(T).name(), res);
}

转载于:https://www.cnblogs.com/adeng-x/p/8097771.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值