GrabBag/AppUtils/AppCommon/Src/SingleInstanceManager.cpp

52 lines
1.4 KiB
C++

#include "SingleInstanceManager.h"
#include <QDebug>
SingleInstanceManager::SingleInstanceManager(const QString& appKey)
: m_appKey(appKey)
, m_semaphore(nullptr)
, m_sharedMemory(nullptr)
, m_isRunning(false)
{
// 创建系统信号量,用于同步访问共享内存
m_semaphore = std::make_unique<QSystemSemaphore>(appKey + "_semaphore", 1);
m_semaphore->acquire(); // 获取信号量
// 创建共享内存对象
m_sharedMemory = std::make_unique<QSharedMemory>(appKey + "_memory");
// 尝试附加到现有的共享内存
if (m_sharedMemory->attach()) {
// 如果能够附加,说明已有实例在运行
m_isRunning = true;
} else {
// 尝试创建新的共享内存
if (!m_sharedMemory->create(1)) {
// 创建失败,可能是因为已经存在
qDebug() << "Unable to create shared memory segment:" << m_sharedMemory->errorString();
m_isRunning = true;
} else {
// 成功创建,当前是唯一实例
m_isRunning = false;
}
}
m_semaphore->release(); // 释放信号量
}
SingleInstanceManager::~SingleInstanceManager()
{
release();
}
bool SingleInstanceManager::isAnotherInstanceRunning() const
{
return m_isRunning;
}
void SingleInstanceManager::release()
{
if (m_sharedMemory) {
m_sharedMemory->detach();
}
}