软件运行唯一性

软件运行唯一性,我这里的意思同一个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;		//共享内存创建失败
        
    ...           // 以下是正常启动代码
}

共享内存如果能够被attach,说明该共享内存是被其他相同的进程创建过,所以退出程序;
如果无法attach,则表示共享内存不存在,软件,可以继续运行,并且需要创建共享内存防止其他进程启动。
不过这里需要注意进程同时启动的情况,所以最好加个共享内存互斥锁。

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、文件锁方式
待后续更新实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值