• 9558阅读
  • 4回复

[提问]使用QSharedMemory时遇到的问题 [复制链接]

上一主题 下一主题
离线鹰击长空
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-07
我在使用QSharedMemory存储一个QList数据时,发现创建成功了,但是另外一个进程去访问这片共享内存的时候,无法正常访问。贴出代码,请求了解的人解惑,是不是QSharedMemory只能存储char ,int这种类型的数据,对于容器甚至类就无法存储了。
shareload工程,创建共享内存
core.h
#ifndef _CORE_H
#define _CORE_H
#include <QWidget>
#include <QSharedMemory>
class ShareMemoryLoad:public QWidget
{
Q_OBJECT
public:
ShareMemoryLoad(QWidget *parent=0);
~ShareMemoryLoad();
private:
QSharedMemory sharedMem;
void loadIntoSharedMem();
};
#endif

core.cpp
#include "core.h"
#include <QList>
ShareMemoryLoad::ShareMemoryLoad(QWidget *parent):QWidget(parent),sharedMem("MemoryTest")
{
loadIntoSharedMem();
}
ShareMemoryLoad::~ShareMemoryLoad()
{}
void ShareMemoryLoad::loadIntoSharedMem()
{
  if (sharedMem.create(5))
  {
   sharedMem.lock();    
   QList<int> from;
   from.append(1);
   from.append(5);
   from.append(9);
   from.append(7);
   from.append(7);
  
   QList<int> *to=static_cast<QList<int>*>(sharedMem.data());
   int s=from.size();
   memcpy(to,&from,s);
         sharedMem.unlock();
  
  }
}

main.cpp
#include <QApplication>
#include "core.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
ShareMemoryLoad mem;
mem.show();
return app.exec();
}

===========================================================================
showshare工程,显示共享内存的内容
core.h
#ifndef _CORE_H
#define _CORE_H
#include <QWidget>
#include <QSharedMemory>
class ShareMemoryLoad:public QWidget
{
Q_OBJECT
public:
ShareMemoryLoad(QWidget *parent=0);
~ShareMemoryLoad();
private:
QSharedMemory sharedMem;
void loadIntoSharedMem();
};
#endif

core.cpp
#include "core.h"
#include <QBuffer>
#include <QList>
#include <list>
using namespace std;
ShareMemoryLoad::ShareMemoryLoad(QWidget *parent):QWidget(parent),sharedMem("MemoryTest")
{
loadIntoSharedMem();
}
ShareMemoryLoad::~ShareMemoryLoad()
{}
void ShareMemoryLoad::loadIntoSharedMem()
{
  if (sharedMem.attach())
  {          
   sharedMem.lock();
   const QList<int> *list=static_cast<const QList<int>*>(sharedMem.constData());
   int s=list->size();
   QList<int> test;
   memcpy(&test,list,s);
   sharedMem.unlock();    
  }    
}

main.cpp
#include <QApplication>
#include "core.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
ShareMemoryLoad mem;
mem.show();
return app.exec();
}
===================================================================
shareload工程能成功运行,在运行showshare工程,执行到loadIntoSharedMem函数的const QList<int> *list=static_cast<const QList<int>*>(sharedMem.constData());时,无法正确获得存储的QList,请教下我的代码写的有问题么,或者告知正确的方法,万分感谢。
离线dbzhang800

只看该作者 1楼 发表于: 2011-04-07
两处涉及到 memcpy 的地方都是错的。建议你考虑 QDataStream
离线鹰击长空

只看该作者 2楼 发表于: 2011-04-07
可否帮小弟改正一下,这个东东折腾了我好久了
离线dbzhang800

只看该作者 3楼 发表于: 2011-04-07
引用第2楼鹰击长空于2011-04-07 17:09发表的  :
可否帮小弟改正一下,这个东东折腾了我好久了


算了,给你个完整的例子

  1. #include <QtCore/QCoreApplication>
  2. #include <QtCore/QSharedMemory>
  3. #include <QtCore/QList>
  4. #include <QtCore/QDataStream>
  5. #include <QtCore/QDebug>
  6. int main(int argc, char *argv[])
  7. {
  8.     QCoreApplication a(argc, argv);
  9.     QSharedMemory sharedmem("dbzhang800-shared-qt4");
  10.     if (sharedmem.create(1024)) {
  11.         qDebug("shared memory created.");
  12.         QList<int> dataList;
  13.         dataList<<1<<2<<3<<4<<5;
  14.         QByteArray bytes;
  15.         QDataStream stream(&bytes, QIODevice::WriteOnly);
  16.         stream << dataList;
  17.         sharedmem.lock();
  18.         char * to = static_cast<char*>(sharedmem.data());
  19.         ::memcpy(to, bytes.data(), bytes.size());
  20.         sharedmem.unlock();
  21.     } else if (sharedmem.attach()) {
  22.         qDebug("shared memory attached.");
  23.         sharedmem.lock();
  24.         QByteArray bytes(static_cast<char*>(sharedmem.data()), 1024);
  25.         sharedmem.unlock();
  26.         QList<int> dataList;
  27.         QDataStream stream(bytes);
  28.         stream>>dataList;
  29.         qDebug()<<dataList;
  30.     }
  31.     else {
  32.         qDebug("unknown error.");
  33.     }
  34.     return a.exec();
  35. }
离线鹰击长空

只看该作者 4楼 发表于: 2011-04-08
回 3楼(dbzhang800) 的帖子
很感谢,灰常感谢,我再看看你的例子,仔细研究下原理,貌似QDataStream很是有用,以前都没接触过。
快速回复
限100 字节
 
上一个 下一个