Qt QSharedMemory Как обновить расположение общей памяти

У меня есть библиотека (testlib-lib.so), с которой связаны 2 разных приложения Qt. Моя проблема в том, что я не могу обновить общую память после ее инициализации.

void TestLib::createInitialSharedMemory() {

// Create shared memory
qDebug() << "Creating new shared memory...";
sharedAudioMemory.setKey("globalAudioBufferSharedMemory");

// First, test whether a shared memory segment is already attached to the process.
// If so, detach it
if (sharedAudioMemory.isAttached())
{
sharedAudioMemory.detach();
}

// Try to create memory of our required size
int sizeOfSharedData = 60 * 8000 * 2; // 60 Seconds x 8 KHz * 2 Bytes ( signed short )
if ( !sharedAudioMemory.create( sizeOfSharedData ) )
{
qDebug() << "ERROR: Failed to Allocate Shared Memory of size: " << sizeOfSharedData;
}

}

void TestLib::writeToSharedMemory( QString text ) {

// Create a buffer and data stream and some text to shove in there
QBuffer buffer;
buffer.open( QBuffer::ReadWrite );
QDataStream out( &buffer );
out << text;
int size = buffer.size();

if (!sharedAudioMemory.attach()) {

// If an attempt of reading from the shared memory before data is written
qDebug() << "Cannot attach to shared memory to update!";

}

// Write into the shared memory
sharedAudioMemory.lock();
qDebug() << "Writing data to buffer: " << text;
char *to = (char*)sharedAudioMemory.data();
const char *from = buffer.data().data();
memcpy( to, from, qMin( sharedAudioMemory.size(), size ) );
sharedAudioMemory.unlock();

}

Qt App A имеет следующее в main ():

// Create the shared memory and load some data
TestLib loadData;
loadData.createInitialSharedMemory();
loadData.writeToSharedMemory("12345 init shared memory");

// This is the key
QSharedMemory sharedAudioMemory("globalAudioBufferSharedMemory");

// Attempt to attach to shared memory for the audio buffer
if (!sharedAudioMemory.attach()) {

//If an attempt of reading from the shared memory before data is written
qDebug() << "ERROR: Failed to attach to shared memory...";
return -1;

}

// Define a buffer to read the data in
QBuffer buffer;
QDataStream in(&buffer);
QString text;

// Lock the memory and read the data
sharedAudioMemory.lock();
char* pointer = (char*)sharedAudioMemory.constData();
buffer.setData((char*)sharedAudioMemory.constData(), sharedAudioMemory.size()); // Sets the contents of the internal buffer to be the first size bytes of data.
buffer.open(QBuffer::ReadOnly);
in >> text;
sharedAudioMemory.unlock();
sharedAudioMemory.detach();

Qt App B пытается обновить общую память, выполнив:

void Control::updateText() {

// Create seed for the random
// That is needed only once on application startup
QTime time = QTime::currentTime();
qsrand((uint)time.msec());

// Get random value between 0-100
int randomValue = qrand() % ((1000 + 1) - 2) + 2;

// Create the shared memory and load some data
TestLib loadData;
QString randomText = QString("%1 test asdf %2 test asdf %3 test asdf %4").arg(randomValue).arg(randomValue).arg(randomValue).arg(randomValue);
loadData.writeToSharedMemory(randomText);

}

После инициализации общей памяти в «12345 init shared memory» я не могу обновить хранилище текста там. Когда я вызываю метод updateText () в приложении B, вызывается библиотечный метод writeToSharedMemory (), а qDebug () в методе печатает текст, который я хочу обновить, в общей памяти, но когда я вызываю следующий код после попытки обновить разделяемую память, она всегда печатает исходный текст «12345 init shared memory»:

// Attempt to attach to shared memory for the audio buffer
if (!sharedAudioMemory.attach()) {

// If an attempt of reading from the shared memory before data is written
qDebug() << "ERROR: Failed to attach to shared memory...";

}

// Define a buffer to read the data in
QBuffer buffer;
QDataStream in(&buffer);
QString text;

// Lock the memory and read the data
sharedAudioMemory.lock();
char* pointer = (char*)sharedAudioMemory.constData();
buffer.setData((char*)sharedAudioMemory.constData(), sharedAudioMemory.size()); // Sets the contents of the internal buffer to be the first size bytes of data.
buffer.open(QBuffer::ReadOnly);
in >> text;
sharedAudioMemory.unlock();
sharedAudioMemory.detach();

// Print the data
qDebug() << "SHARED TEXT IS: " << text;

Почему я не могу обновить общую память? Что я делаю неправильно? Спасибо —

2

Решение

Я нашел ошибку после распечатки ‘errorString ()’ здесь:

if (!sharedAudioMemory.attach()) {

// If an attempt of reading from the shared memory before data is written
qDebug() << "Cannot attach to shared memory to update! ERROR: " << sharedAudioMemory.errorString();

}

Не было никакого связанного ключа, таким образом это не отрывалось. Поэтому я изменил эту функцию на:

// Assign the key so we can update the data
sharedAudioMemory.setKey("globalAudioBufferSharedMemory");
if (!sharedAudioMemory.attach()) {

// If an attempt of reading from the shared memory before data is written
qDebug() << "Cannot attach to shared memory to update! ERROR: " << sharedAudioMemory.errorString();

}

И это работает — я могу изменить общую память просто отлично.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]