问题
让应用程序只有一个运行实例
 QSharedMemory除了可以完成进程间通信,还可以实现应用程序单例化。
解法
 首先,看看QSharedMemory的几个函数:
1、QSharedMemory(const QString &key, QObject *parent = Q_NULLPTR)构造函数
该构造函数为给定的parent指针构造共享内存对象,并以key作为该对象的键值。
2、bool create(int size, AccessMode mode = ReadWrite) 函数
该函数为标识了键值key的共享内存对象创建内存空间。size是向系统申请的内存空间大小(即字节数),存取方式mode 默认为ReadWrite。
3、bool attach(AccessMode mode = ReadWrite) 函数
该函数将进程和标识了键值key的共享内存进行绑定。如果未调用create申请共享内存空间,则无法调用attach进行绑定。返回false。
方法一、利用共享内存不能重复Create。
代码如下。
#include "mainwindow.h"
#include <QApplication>
#include <QSharedMemory>
#include <QMessageBox>
#include <QDebug>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QSharedMemory *sharedMemory = new QSharedMemory(QString("Single.exe"));
    if (sharedMemory->create(1))
    {
        MainWindow w;
        w.show();
        return a.exec();
    }
    else
    {
        qDebug()<<"Has running";
        QMessageBox::information(0, "提示", "程序已运行!");
    }
    delete sharedMemory;
    sharedMemory = NULL;
}
 
效果:
方法二、未创建共享内存,不能Attach。
#include <QApplication>
#include <QSharedMemory>
int main(int argc, char *argv[])
{
    //通过共享内存,让程序只产生一个运行实例
    QSharedMemory shared("MainWindow.exe");//该共享内存键值为MainWindow.exe
    if(shared.attach(QSharedMemory::ReadOnly))//利用attach无法绑定未申请内存空间的特点判断该应用程序是否唯一
    {
        return 0;//非唯一,结束程序运行
    }
    shared.create(1);//创建共享内存,空间大小为1字节
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
 
参考:
https://blog.csdn.net/qq_42113801/article/details/113957610


















