在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?
创建互斥体实现(强烈推荐新手用这个方法)
CreateMutex是一个计算机函数,作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。这个方法是最为简单的一个方法,语法逻辑比较容易接受,后面的进程,内存,原子等操作,需要有一定操作水平的程序员才能了解。
代码如下
QT平台基于共享内存QSharedMemory(标准C++请参考下面)
基于Qt的实现是利用了Qt中的共享内存(QSharedMemory),第一个运行的exe创建一个共享内存,后续的程序如果能访问到此内存,就认为已有exe存在了。代码如下:
C++共享全局变量实现方式
通过共享全局变量的方式实现进程单实例运行
基于windows C++寻找进程数量
每次运行一个exe实例就会产生一个进程,而只要找出进程的数量也就能锁定产生了几个exe实例,如果进程的数量大于1,我们就放弃实例化。
通过查找系统原子表的方法来判断
这个方法是网上所查找的,不建议用这个方法
通过FindWindow函数来判断
FindWindow这个函数检索处理顶级窗口的类名和窗口名称匹配指定的字符串。这个函数不搜索子窗口。这种方法有缺陷,窗口名字改变之后就再也找不到了,FindWindow()的参数ClassName和Caption比较难取得。当然不是所有的程序会有产生窗口,比如控制台程序或者服务程序,并不会创建窗口,所以这个只是作为一个参考。
文件记录猥琐方法
这个方法可能也适合一个新手,在exe运行的时候你可以记录到本地文件夹的一个文档里,每次运行exe就去读文档里面的配置,看是否已经有实例已经在运行。具体代码可能偏多,但是简单,这里就不贴出代码了。
属性设置或者注册表设置猥琐办法
通过SetProp()为程序主窗口设置一个特殊的Property,然后在启动时遍历所有的窗口,找出包含着个Property的窗口局柄。或者说你可以直接将这个属性写到注册表里,每次运行实例的时候去看注册表的值判断。