软件运行唯一性,我这里的意思同一个app,同一时间,只能有一个实例化运行。
为了使一个应用程序在同一时间只运行一个实例,需要用某种方法在程序启动时,检测是否已有正在运行的实例,如果有则直接退出,如果没有,则正常启动。
1、共享内存实现:
使用qt代码做示范,main函数中添加如下代码:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSharedMemory shared_memory("openOne_thisApp");
if(shared_memory.attach())
{
QMessageBox::showWarning(nullptr, QObject::tr("请勿重复打开App"), QMessageBox::Ok);
return 0; //共享内存段已被绑定,说明已经有app打开
}
if(!shared_memory.create(1))
return 0; //共享内存创建失败
... // 以下是正常启动代码
}
2、互斥量实现
使用Windows的API创建一个互斥量标记软件运行,代码如下
#include <windows.h>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HANDLE hMutex = CreateMutex(NULL, TRUE, L"YourApp"); // 创建一个互斥量来保证只运行一个实例
if(hMutex != NULL)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
QMessageBox::showWarning(nullptr, QObject::tr("请勿重复打开App"), QMessageBox::Ok);
return 1;
}
}
... // 以下是正常启动代码
}
3、进程查询方式
参考文章:windows下使用qt查询进程是否存在
思路很简单,就是查询到此进程存在就退出。
但是有个问题就是,你本身就是这个进程,所以需要判断是否有两个这样的进程。或者在第三方app中启动该进程,我们称这个第三方app为守护进程。
守护进程实现方式:https://blog.csdn.net/weixin_42887343/article/details/111781260
4、文件锁方式
待后续更新实现。