问题
让应用程序只有一个运行实例
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