运行一个实例的程序(互斥程序)
有的时候我们需要编写出的应用程序在同一时间只允许运行一个实例。有一种比较流行的方式,解决另人恶心的“ 该程序已经运行” 的对话框,比如千千静听,如果程序被第二次运行,它会直接将已经打开的程序前置,这样做确实温柔许多。
方法一:同步基元 (互斥对象Mutex )
通过 CreateMutex 创建互斥对象 -- 使程序只能运行一个实例
在程序开始运行时使用CreateMutex 来创建互斥对象 ,如果在这之前本程序已经运行了,互斥对象就不能成功创建,这样就能判断在程序运行前是否已有一个本程序的实例在运行了。这种方法相对比较简单,而且很稳定。互斥锁定可以在另一个进程中定义, 因为操作系统知道有名称的互斥锁定, 它由不同的进程共享. 如果没有给互斥锁定指定名称, 互斥锁定就是未命名的, 不在不同的进程之间共享.
在程序运行的初始化阶段加入以下代码:
注意CreateMutex 的第三个参数,它指定了互斥对象的标志 ,系统就是根据此标志来识别是否是同一个互斥对象,为了防止别的程序和我们的程序使用相同的互斥对象造成程序无法运行,我建议大家创建一个GUID 并且加上自己的信息作为标识,这样和别的程序标识相同的概率就几乎为0 了。 在程序结束阶段别忘了关闭互斥对象的句柄:CloseHandle(Only);
方法二:判断进程 (遍历进程)
如果程序是多线程的(比如Chrome 浏览器),便无法正确处理下去。这种情况更适合使用方法一。
方法三:全局原子法
算是非常古老的方法,就是利用Windows 给我们提供的全局原子来进行判断。