首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与QSharedMemory共享多个网段

与QSharedMemory共享多个网段
EN

Stack Overflow用户
提问于 2014-01-21 21:32:28
回答 1查看 639关注 0票数 0

我想使用QSharedMemory在两个应用程序之间共享数据,使用它可以完美地共享一个数据段,但是当我尝试共享多个数据段时,我只能访问最后一个数据段

这是我的代码

第一个应用程序中的sharedMemroy.cpp

代码语言:javascript
复制
void SharedMemory::loadIntoSharedMem(QString memoryKey,QString &data)
    {
    sharedMem.setKey(memoryKey);
    if (sharedMem.isAttached())
        {
        sharedMem.detach();
        }
    if( data.length())
        {
    // load into shared memory
         QBuffer buffer;
         buffer.open(QBuffer::ReadWrite);
         QDataStream out(&buffer);
         out << data;
         int size = buffer.size();

         if (!sharedMem.create(size)) {
             qDebug()<<"Unable to create shared memory segment."<<sharedMem.isAttached()<<" "<<sharedMem.error();

         }

         sharedMem.lock();
         char *to = (char*)sharedMem.data();
         const char *from = buffer.data().data();
         memcpy(to, from, qMin(sharedMem.size(), size));
         sharedMem.unlock();
        }
    else
        {
          qDebug()<< "no data to share"
        }

    }

在main中

代码语言:javascript
复制
SharedMemory sh;
sh.loadIntoSharedMem("memo1",data1 );
sh.loadIntoSharedMem("memo2",data2 );
sh.loadIntoSharedMem("memo3",data3 );

在第二个应用程序中的showSharedData.cpp上

代码语言:javascript
复制
QString ShowSharedMemory::loadFromSharedMem(QString memoryKey)
{
    sharedMem.setKey(memoryKey);
    if (!sharedMem.attach())
    {
        qDebug()<<"Unable to load!";
        return"";
    }

    QBuffer buffer;
    QDataStream in(&buffer);
    QString text;

    sharedMem.lock();
    buffer.setData((char*)sharedMem.constData(), sharedMem.size());
    buffer.open(QBuffer::ReadOnly);
    in >> text;
    sharedMem.unlock();

    sharedMem.detach();
    return text;

}

在main中

代码语言:javascript
复制
data1=showMemory.loadFromSharedMem("memo1");
data2=showMemory.loadFromSharedMem("memo2");
data3=showMemory.loadFromSharedMem("memo3");

谢谢你的帮忙

EN

回答 1

Stack Overflow用户

发布于 2014-01-21 22:54:28

您的问题是第二次写入尝试会覆盖所有数据。如果你想通过共享内存共享数据,你需要实现跨进程的容器(boost有一些),比如QList。这是一个很难的话题。

我建议您使用套接字在进程之间发送字符串。或其他依赖于平台的机制(例如,windows上的管道)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21259658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档