08-project-shareMemoryRead

本文介绍了如何在Qt中创建一个名为Widget的类,通过QSharedMemory进行跨进程共享内存管理,包括构造函数中初始化和检查共享内存,以及析构函数中的资源清理。还展示了如何在槽函数中读取并显示共享内存中的UTF-8编码文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox> // 引入QMessageBox头文件,用于提供用户交互对话框,增强程序的用户体验

// Widget类构造函数,负责初始化用户界面和共享内存
Widget::Widget(QWidget *parent)
    : QWidget(parent) // 调用基类QWidget的构造函数
    , ui(new Ui::Widget) // 初始化用户界面对象
{
    ui->setupUi(this); // 调用setupUi方法来布局和初始化用户界面

    // 创建一个QSharedMemory对象,用于管理共享内存
    shareMemory = new QSharedMemory(this); 
    shareMemory->setKey("mengfan"); // 设置共享内存的键,用于跨进程识别共享内存段

    // 尝试附加到一个已存在的共享内存段
    if (!shareMemory->attach())
    {
        // 如果附加失败,通过QMessageBox弹出一个错误对话框,提示用户无法附加到共享内存
        QMessageBox::critical(this, "共享内存错误", "无法附加到共享内存。");
        return; // 退出构造函数,避免继续执行可能导致的错误
    }
}

// Widget类析构函数,负责清理资源
Widget::~Widget()
{
    // 检查共享内存是否已附加,如果是,则断开连接以避免资源泄露
    if (shareMemory->isAttached())
        shareMemory->detach();

    // 删除QSharedMemory对象和用户界面对象,释放内存
    delete shareMemory;
    delete ui;
}

// 槽函数,响应界面上"读取共享内存"按钮的点击事件
void Widget::on_shareMemoryRead_clicked()
{
    // 首先检查共享内存是否已成功附加
    if (!shareMemory->isAttached())
    {
        // 如果没有附加,弹出一个信息对话框告知用户
        QMessageBox::information(this, "警告", "共享内存未附加。");
        return; // 中断执行,不继续读取操作
    }

    // 安全地转换共享内存的原始数据指针为char指针
    char *pData = static_cast<char*>(shareMemory->data());

    // 确保数据指针有效
    if (pData)
    {
        // 获取共享内存中的数据大小,确保只读取有效数据范围
        int dataSize = shareMemory->size();
        // 使用QByteArray从共享内存构造数据缓冲区,便于处理
        QByteArray dataBuffer(pData, dataSize);

        // 假设共享内存中存储的是UTF-8编码的文本,将其转换为QString以便显示
        QString sharedText = QString::fromUtf8(dataBuffer);

        // 将读取到的文本数据显示在textEdit控件上
        ui->textEdit->setText(sharedText);
    }
    else
    {
        // 数据指针无效时,向用户显示信息表示共享内存数据不可读
        ui->textEdit->setText("共享内存数据不可读。");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值