【QT】QSharedMemory 打包后exe只运行一个实例

只运行一个exe

在 Qt 框架中,QSharedMemory 类用于在多个进程之间共享内存。这通常用于同步操作或实现进程间通信(IPC)。当创建一个 QSharedMemory 对象并指定一个键(在这个例子中是 "onlyOne")时,正在尝试访问或创建一个与该键相关联的共享内存段。

cpp 复制代码
	#include <qsharedmemory.h>
    // 只运行一个exe
    QSharedMemory shared("onlyOne");

	// 尝试连接到已存在的共享内存  
    if (shared.attach())
    {
    	// 已经存在一个运行的实例
        return 0;
    }
    shared.create(1);
创建共享内存
cpp 复制代码
QSharedMemory shared("onlyOne");  
if (!shared.create(1024)) { // 假设我们想要1024字节的共享内存  
    qDebug() << "Unable to create shared memory segment.";  
    return;  
}
连接到已存在的共享内存
cpp 复制代码
QSharedMemory shared("onlyOne");  
if (!shared.attach()) { // 尝试连接到已存在的共享内存  
    qDebug() << "Unable to attach to shared memory segment.";  
    return;  
}
读写共享内存

使用 lock() 和 unlock() 方法来确保在读写共享内存时没有其他进程同时进行这些操作。使用 data() 方法获取一个指向共享内存数据的指针。

cpp 复制代码
	if (shared.lock()) {  
    char *to = static_cast<char*>(shared.data());  
    const char message[] = "Hello, world!";  
    std::copy(message, message + sizeof(message) - 1, to); // 注意不要越界  
    shared.unlock();  
}
删除共享内存

当不再需要共享内存段时,可以使用 detach() 方法断开连接(如果之前已经连接了),并使用 remove() 方法删除它。

cpp 复制代码
shared.detach(); // 如果之前连接了  
shared.remove(); // 删除共享内存段
相关推荐
言乐6几秒前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript
liulilittle1 分钟前
短期内不存在通用 AI 工作流魔法
大数据·开发语言·c++·人工智能·llm·agent·tools
charmingmm8157 分钟前
数据库和数据表的设计和命名经验
数据库
郝学胜-神的一滴17 分钟前
C++ Templates 03:手写一个Stack看透模板核心机制
开发语言·c++·产品运营·软件工程·产品经理
(Charon)32 分钟前
【C/C++面试】手写内存池:从空闲链表到内存申请与释放
java·开发语言·windows
EatFan33 分钟前
Spring Boot 4 迁移避坑清单:Jackson 3、starter 拆分与最低 JDK 口径核对(含若依/芋道/CRMEB 升级对照)
java·数据库·spring boot·spring boot 4·java 21·jakarta ee 11·jackson 3
派小心.34 分钟前
页面关闭前埋点丢失:sendBeacon验收
开发语言·php
其实防守也摸鱼37 分钟前
渗透测试学习计划(全栈综合 · 零基础进阶)
android·数据库·学习·安全·oracle·自动化·学习方法
ZealSinger38 分钟前
Go1.25 FlightRecorder慢请求截trace
网络·数据库·go
Java后端的Ai之路44 分钟前
Python 进阶探索25 - difflib模块之文本对比
开发语言·python·django·哈希算法·difflib