应用程序单例
来源:互联网 发布:mysql临时表 编辑:程序博客网 时间:2024/06/05 03:14
注1:最简单办法,创建系统核心对象(IPC中很多,如windows event/mutex...),检查核心对象是否创建成功,如不成功app退出,成功继续启动。
注2:创建共享区,如
#pragma data_seg("flag_data")
int app_count = 0;
#pragma data_seg()
#pragma comment(linker,"/SECTION:flag_data,RWS")
app判断app_count即可。
Qt共享内存计数方式(小题大做)
singleinstancesharedmemory.h
#ifndef SINGLEINSTANCESHAREDMEMORY_H#define SINGLEINSTANCESHAREDMEMORY_H#include <QSharedMemory>//Note: Call addRef firstclass SingleInstanceSharedMemory : public QSharedMemory{Q_OBJECTpublic:SingleInstanceSharedMemory(const QString &key, QObject *parent = nullptr);~SingleInstanceSharedMemory();<pre name="code" class="cpp"><pre name="code" class="cpp">int addRef();int releaseRef();bool isRunning();
private:
<span style="font-family: Arial, Helvetica, sans-serif;">bool incrementIns();</span>bool decrementIns();};#endif // SINGLEINSTANCESHAREDMEMORY_Hsingleinstancesharedmemory.cpp
#include "singleinstancesharedmemory.h"SingleInstanceSharedMemory::SingleInstanceSharedMemory(const QString &key, QObject *parent/* = nullptr*/): QSharedMemory(key,parent){}SingleInstanceSharedMemory::~SingleInstanceSharedMemory(){}bool SingleInstanceSharedMemory::decrementIns(){if(this->isAttached()){lock();char *data = (char*)this->data();*data = '0';unlock();return true;}return false;}bool SingleInstanceSharedMemory::incrementIns(){if(this->isAttached()){lock();char *data = (char*)this->data();*data = '1';unlock();return true;}return false;}bool SingleInstanceSharedMemory::isRunning(){if(this->isAttached()){char ret;lock();char *data = (char*)this->data();ret = *data;unlock();if ('1' == ret){return true;}}return false;}int SingleInstanceSharedMemory::addRef(){ if (!create(1)) { if (QSharedMemory::AlreadyExists == error()) { //SharedMemory has already existed if (attach()) { lock(); char data = *((char*)this->data()); unlock(); if ('1' == data) { return QSharedMemory::AlreadyExists; } } } }if(incrementIns()){return QSharedMemory::NoError;}else{return QSharedMemory::UnknownError;}}int SingleInstanceSharedMemory::releaseRef(){if(decrementIns()){return QSharedMemory::NoError;}else{return QSharedMemory::UnknownError;}}
程序启动时:
SingleInstanceSharedMemory *share_memory = new SingleInstanceSharedMemory(QString("SingleInstanceApplication"));if(QSharedMemory::AlreadyExists == share_memory->addRef()){//ShowAppMainWindow();return 0; }如果有注销,可调用:
share_memory->releaseRef()
0 0
- 应用程序单例
- 创建单例winform应用程序
- 单例应用程序的实现
- Android单例关闭应用程序
- 让应用程序单例方式运行
- 使用 Mutex 创建 单例应用程序
- 单例,应用程序委托和顶层数据
- 单例,应用程序委托和顶层数据
- QSharedMemory实现应用程序的单例运行
- CScrollView单文本应用程序
- 单应用程序(from web)
- 单文档视图应用程序
- 单页Web应用程序
- 单页面应用程序
- 单页面应用程序
- windows应用程序单实例
- 创建单例winform应用程序的一种更好的方式
- 应用程序委托和新的单例(译)
- Java中的static关键字解析
- android中?attr/**与@drawable/**或@color/**等的区别
- oracle blog
- 想念我的小伙伴
- CABasicAnimation的简单介绍
- 应用程序单例
- css动画效果transtion,transform,animation
- 给Activity添加自己需要的方法
- DataTable 和List 相互转换
- iOS 【AppDelegate.h/.m】
- Oracle常用函数整理
- java 查找,插入,冒泡排序
- NYOJ 1011 So Easy[II] (求N边形面积)
- 要改变口袋,先改变脑袋