如何从共享内存中读取和写入以创建数组QT

时间:2015-06-25 01:46:20

标签: c++ qt

我尝试了以下内容:

int a[5]={1,2,3,4,5};
QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream out(&buffer);
    out << a[5];
    int size = buffer.size();

    if (!sharedMemory.create(size)) {
        ui.label->setText(tr("Unable to create shared memory segment."));
        return;
    }
    sharedMemory.lock();
    char *to = (char*)sharedMemory.data();
    const char *from = buffer.data().data();
    memcpy(to, from, qMin(sharedMemory.size(), size));
    sharedMemory.unlock();

读取

sharedMemory.attach();
QBuffer buffer;
    QDataStream in(&buffer);
    int a[5];
    //QImage image;
    QString fileName;
    int num;
    sharedMemory.lock();
    buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
    buffer.open(QBuffer::ReadOnly);
    in >> a[5];
    sharedMemory.unlock();

但我认为错误的方式。我不知道如何读写是一个字符和整数数组。

1 个答案:

答案 0 :(得分:0)

这里的第一个真正问题是a[5]:数组a只有5个项目,所以第5个索引超出了它的范围。要编写和读取整个数组,您可以1)一次完成一个项目;或2)使用矢量或列表对象,例如QVector

<强> 1。如数组

写:

int a[5]={1,2,3,4,5};

QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);

//write item by item
for (int i=0; i<5; i++) {
    out << a[i];
}

int size = buffer.size();
if (!sharedMemory.create(size)) {
    cout << "Unable to create shared memory segment: "<<sharedMemory.errorString().toStdString()<<endl;
    return;
}
sharedMemory.lock();
char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));
sharedMemory.unlock();

读:

sharedMemory.attach();
QBuffer buffer;
QDataStream in(&buffer);

sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
buffer.open(QBuffer::ReadOnly);

int len = sharedMemory.size()/sizeof(int);
int* a = new int[len];
for (int i=0; i< len; i++) {
    in >> a[i];
}
sharedMemory.unlock();
//delete a; 

(注意:请勿忘记在使用后删除a。)

<强> 2。作为QVector

写:

QVector<int> vec;
vec << 1<<2<<3<<4<<5;

QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);

//write the vector object
out << vec;

int size = buffer.size();
if (!sharedMemory.create(size)) {
    cout << "Unable to create shared memory segment: "<<sharedMemory.errorString().toStdString()<<endl;
    return;
}
sharedMemory.lock();
char *to = (char*)sharedMemory.data();
const char *from = buffer.data().data();
memcpy(to, from, qMin(sharedMemory.size(), size));
sharedMemory.unlock();

读:

sharedMemory.attach();
QBuffer buffer;
QDataStream in(&buffer);

sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
buffer.open(QBuffer::ReadOnly);

QVector<int> vec;
in>>vec;
sharedMemory.unlock();