让应用程序只有一个运行实例
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。
下面代码展示如何使应用程序单例化:
利用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();
}