macos Qt设置互斥,只启动一个程序
时间: 2024-03-27 21:39:52 浏览: 104
在 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);
}
```
阅读全文