【无标题】

#include <QCoreApplication>
#include <QThread>
#include <iostream>
#include <QString>
#include <QSharedMemory>
#include <QMap>
#include <QDataStream>

// 自定义类型结构体
struct CustomData {
    QString name;
    int value;
};

// 自定义结构体的序列化和反序列化操作符
QDataStream& operator<<(QDataStream& out, const CustomData& data) {
    out << data.name << data.value;
    return out;
}

QDataStream& operator>>(QDataStream& in, CustomData& data) {
    in >> data.name >> data.value;
    return in;
}

// 公共内存管理类
class SharedMemoryManager {
public:
    // 写入数据到共享内存
    static bool writeData(const QMap<QString, CustomData>& dataMap);

    // 从共享内存读取数据
    static QMap<QString, CustomData> readData();
};

bool SharedMemoryManager::writeData(const QMap<QString, CustomData>& dataMap) {
    QSharedMemory sharedMemory("SharedData");

    if (!sharedMemory.create(sizeof(QMap<QString, CustomData>))) {
        std::cout << "Failed to create shared memory." << std::endl;
        return false;
    }

    sharedMemory.lock();
    QByteArray byteArray;
    QDataStream stream(&byteArray, QIODevice::WriteOnly);
    stream << dataMap;
    std::memcpy(sharedMemory.data(), byteArray.constData(), byteArray.size());
    sharedMemory.unlock();

    return true;
}

QMap<QString, CustomData> SharedMemoryManager::readData() {
    QMap<QString, CustomData> dataMap;

    QSharedMemory sharedMemory("SharedData");
    if (!sharedMemory.attach()) {
        std::cout << "Failed to attach to shared memory." << std::endl;
        return dataMap;
    }

    sharedMemory.lock();
    const char* sharedData = static_cast<const char*>(sharedMemory.constData());
    QByteArray byteArray(sharedData, sharedMemory.size());
    QDataStream stream(&byteArray, QIODevice::ReadOnly);
    stream >> dataMap;
    sharedMemory.unlock();

    return dataMap;
}

// 线程类
class DataThread : public QThread {
public:
    void run() override {
        // 读取当前数据
        QMap<QString, CustomData> currentData = SharedMemoryManager::readData();
        std::cout << "Thread ID: " << QThread::currentThreadId() << std::endl;
        for (const QString& key : currentData.keys()) {
            const CustomData& data = currentData.value(key);
            std::cout << "Key: " << key.toStdString() << ", Name: " << data.name.toStdString() << ", Value: " << data.value << std::endl;
        }

        // 更新数据
        QMap<QString, CustomData> newData;
        newData.insert("A", {"Alpha", 10});
        newData.insert("B", {"Beta", 20});
        SharedMemoryManager::writeData(newData);
        std::cout << "Thread ID: " << QThread::currentThreadId() << std::endl;
        std::cout << "Updated data." << std::endl;

        // 读取更新后的数据
        currentData = SharedMemoryManager::readData();
        std::cout << "Thread ID: " << QThread::currentThreadId() << std::endl;
        for (const QString& key : currentData.keys()) {
            const CustomData& data = currentData.value(key);
            std::cout << "Key: " << key.toStdString() << ", Name: " << data.name.toStdString() << ", Value: " << data.value << std::endl;
        }
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    QMap<QString, CustomData> initialData;
    initialData.insert("X", {"XRay", 5});
    initialData.insert("Y", {"Yankee", 15});

    // 设置初始数据
    SharedMemoryManager::writeData(initialData);

    // 创建多个线程并启动
    DataThread thread1;
    DataThread thread2;
    thread1.start();
    thread2.start();

    // 等待线程完成
    thread1.wait();
    thread2.wait();

    // 获取最终数据
    QMap<QString, CustomData> finalData = SharedMemoryManager::readData();
    std::cout << "Final Data:" << std::endl;
    for (const QString& key : finalData.keys()) {
        const CustomData& data = finalData.value(key);
        std::cout << "Key: " << key.toStdString() << ", Name: " << data.name.toStdString() << ", Value: " << data.value << std::endl;
    }

    return app.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值