Делитесь несколькими сегментами с помощью QSharedMemory

я хочу использовать QSharedMemory для обмена данными между двумя приложениями, используя его для совместного использования одного сегмента, работает отлично, но когда я пытаюсь 2 поделиться более чем одним, у меня есть доступ только к последнему.

это мой код

sharedMemroy.cpp в первом приложении

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"
        }

    }

и в основном

SharedMemory sh;
sh.loadIntoSharedMem("memo1",data1 );
sh.loadIntoSharedMem("memo2",data2 );
sh.loadIntoSharedMem("memo3",data3 );

и на showSharedData.cpp во втором приложении

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;

}

и в основном

data1=showMemory.loadFromSharedMem("memo1");
data2=showMemory.loadFromSharedMem("memo2");
data3=showMemory.loadFromSharedMem("memo3");

Спасибо за вашу помощь


person user1527187    schedule 21.01.2014    source источник


Ответы (1)


Ваша проблема в том, что вторая попытка записи перезаписывает все данные. Вам нужно внедрить контейнеры между процессами (у бустера есть некоторые), такие как QList, если вы хотите обмениваться данными через общую память. Это тяжелая тема.

Я предлагаю вам использовать сокеты для отправки строк между процессами. Или другой платформенно-зависимый механизм (например, трубы на окнах).

person Dmitry Sazonov    schedule 21.01.2014
comment
Нет необходимости использовать платформенно-зависимые механизмы. QLocalSocket делает свое дело. - person Kuba hasn't forgotten Monica; 21.01.2014