#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();
}
【无标题】
最新推荐文章于 2024-07-22 23:59:01 发布