应用程序单例

来源:互联网 发布: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_H
singleinstancesharedmemory.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
原创粉丝点击