Qt防止程序重复运行
1.使用共享内存的方法
弊端:使用共享内存方式,当第二个进程启动时,判断内存区数据是否建立,如有,则退出; 这种方式有弊端,在程序发生崩溃时,未及时清除共享区数据,导致程序不能正常启动。
参考:qt之 使程序只运行一个实例,若再次点击exe则将已运行的实例置在最顶层显示_大桶矿泉水的博客-CSDN博客
2.使用全局互斥变量的方法
参考:QT之防止程序重复运行方法_qt防止程序重复运行_m沉默01的博客-CSDN博客
其他参考: C++ QT PC端 防止程序重复启动的几种方式_防止进程重复启动的方法_漫步繁华街的博客-CSDN博客 讲到了使用QT中的 QLockFile:
QLockFile 使用文件提供在不同的进程间的锁。锁文件可以放置多个进程同时访问同一资源。例如磁盘上的配置文件、套接字、端口、共享内存区域等。使用的时候trylock()对资源进行上锁。当程序运行的时候,上锁成功后,会自动生成文件(例如生成的是磁盘上的文件),文件中包含进程ID, 进程名称,当前用户名这三个信息。
正常退出时,lock文件会被自动删除。如果程序崩溃,lock文件还会继续存在,当然也会继续阻止进程启动。
由于这个原因,QFileLock尝试去lock的时候,会首先根据写入文件的进程ID,去查找进程里所有的进程ID。如果没有文件中的进程ID,则认为lock文件已过期,并重新lock成功。
如果恰巧所有的进程里,刚好有这个进程ID,这时候就会把记录lock文件里的进程名称进行比较。
如果进程名也相同,则上锁失败,启动进程失败。如果只是进程ID相同,但进程名不同,还是会认为lock文件已经过期。可以加锁。
此外,QLockFile还考虑了锁文件最后修改时间(默认30秒)。如果发现锁文件已经过期,则删除。
这么看下来,好像程序崩溃不影响再次启动程序。改天试一下。