运行一个实例的程序(互斥程序)

运行一个实例的程序(互斥程序)

有的时候我们需要编写出的应用程序在同一时间只允许运行一个实例。有一种比较流行的方式,解决另人恶心的 该程序已经运行 的对话框,比如千千静听,如果程序被第二次运行,它会直接将已经打开的程序前置,这样做确实温柔许多。


方法一:同步基元 (互斥对象Mutex

通过 CreateMutex 创建互斥对象 -- 使程序只能运行一个实例

 

在程序开始运行时使用CreateMutex 来创建互斥对象 ,如果在这之前本程序已经运行了,互斥对象就不能成功创建,这样就能判断在程序运行前是否已有一个本程序的实例在运行了。这种方法相对比较简单,而且很稳定。互斥锁定可以在另一个进程中定义, 因为操作系统知道有名称的互斥锁定, 它由不同的进程共享. 如果没有给互斥锁定指定名称, 互斥锁定就是未命名的, 不在不同的进程之间共享.

 

在程序运行的初始化阶段加入以下代码:

 

注意CreateMutex 的第三个参数,它指定了互斥对象的标志 ,系统就是根据此标志来识别是否是同一个互斥对象,为了防止别的程序和我们的程序使用相同的互斥对象造成程序无法运行,我建议大家创建一个GUID 并且加上自己的信息作为标识,这样和别的程序标识相同的概率就几乎为0 了。  在程序结束阶段别忘了关闭互斥对象的句柄:CloseHandle(Only);

 

方法二:判断进程 (遍历进程)

如果程序是多线程的(比如Chrome 浏览器),便无法正确处理下去。这种情况更适合使用方法一。

 

方法三:全局原子法

算是非常古老的方法,就是利用Windows 给我们提供的全局原子来进行判断。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 macOS 上,可以使用 `QSystemSemaphore` 和 `QSharedMemory` 实现互斥,确保只启动一个程序实例。具体做法是在程序启动时创建一个命名的 `QSystemSemaphore`,并尝试获得它的锁。如果锁已经被其他程序持有,则代表已有实例运行,此时可以将新的参数传递给已有的实例,并退出当前实例。如果锁没有被持有,则代表没有实例运行,此时可以正常启动程序。 以下是一个示例代码: ```cpp #include <QApplication> #include <QSystemSemaphore> #include <QSharedMemory> #include <QDebug> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个命名的 QSystemSemaphore QSystemSemaphore semaphore("myApp", 1); // 尝试获得锁 if (!semaphore.tryAcquire()) { // 如果锁已经被其他程序持有,则将新的参数传递给已有的实例 QSharedMemory sharedMemory("myApp"); if (!sharedMemory.create(sizeof(int))) { sharedMemory.attach(); } int *params = static_cast<int*>(sharedMemory.data()); *params = 123; sharedMemory.unlock(); return 0; } // 如果锁没有被持有,则正常启动程序 MyMainWindow mainWindow; mainWindow.show(); return app.exec(); } ``` 在上面的代码中,我们首先创建一个命名的 `QSystemSemaphore`,然后尝试获得它的锁。如果锁已经被其他程序持有,则代表已有实例运行,此时我们创建一个命名的 `QSharedMemory`,将新的参数写入共享内存中,并释放锁,然后退出当前实例。 如果锁没有被持有,则代表没有实例运行,此时我们正常启动程序,创建主窗口并显示出来。 需要注意的是,如果程序异常退出,锁可能会被一直持有,导致无法启动新的实例。因此,需要在程序退出时释放锁。可以在主窗口的 `closeEvent()` 中释放锁,或者使用 `QCoreApplication::aboutToQuit()` 信号释放锁。 ```cpp void MyMainWindow::closeEvent(QCloseEvent *event) { // 释放锁 QSystemSemaphore semaphore("myApp", 1); semaphore.release(); QMainWindow::closeEvent(event); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值