52 lines
1.4 KiB
C++
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();
|
||
|
|
}
|
||
|
|
}
|