我们在进行QT开发时,有时会需要防止自己的exe程序启动两次或多次的情况,利用共享内存QSharedMemory的方法,就可轻松解决这个问题。
QT程序的接口函数是main函数,所有程序启动都是从main进入,然后打开窗口运行实例,进行exec消息轮询。所以为了防止程序启动多次,必须要在exe程序实例打开之前阻止程序运行,必须在main函数中操作。
利用共享内存方式防止程序重复启动,首先需要包含头文件#include <QSharedMemory>,然后才能建立共享内存的对象。
建立共享内存对象QSharedMemory(const QString &key, QObject *parent = nullptr),只需填写第一个参数key就可以了,key是QString类型,可以给自己建立的共享内存起一个独一无二的名字,一般是以工程或软件名称英文命名。
建立完成共享内存对象之后,需要利用attach()函数判定该名称的对象是否已经建立,如果已经建立了,说明已经有相同的app在运行了,发出重复运行提醒,退出程序。该过程要在程序自身对象实例运行之前完成。
如果未发现相同名称的共享内存对象,则利用create()函数建立共享内存,函数括号内的参数为共享内存的大小,只做判断占用情况用的话,建立最小的内存即可。
下面是QT在main函数中建立共享内存的例子,myexe为自己建的程序实例名称,仅供参考:
#include "myexe.h"
#include <QApplication>
#include <QSharedMemory> //包含QSharedMemory头文件
#include <QMessageBox> //包含提示框头文件
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
static QSharedMemory *sharMemory = new QSharedMemory("Single_myexe_App"); //新建共享内存,内存key为"Single_myexe_App",不同exe程序可以设置不同名称,用以区分运行程序。
if(sharMemory->attach()) //判断是否有同名称"Single_myexe_App"的共享内存空间被占用。
{
QMessageBox::information(NULL,QStringLiteral("Warning"),QStringLiteral(" 应用程序已运行! "));
return 0; //如果有相同名称的共享内存占用,说明该程序已启动,弹出提醒框,返回值0,退出程序。
}
sharMemory->create(1); //如果没有相同名称的共享内存被占用,则新建名称为"Single_myexe_App"的共享内存,大小最小为1,不涉及共享内存存储或内容传递,建立最小共享内存即可。
myexe w;
w.show();
return a.exec();
}
![](https://img-blog.csdnimg.cn/img_convert/d7197199316125f20a3ea44bcc8077f9.png)