QSharedMemory example
Overview[edit | edit source]
Description[edit | edit source]
Shared memory is supported by Qt through the QSharedMemory
class. Two processes can share the same memory segment for IPC.
Solution[edit | edit source]
The SharedMemoryLoad application loads a string into the shared memory and the ShowSharedMem application shows the string from the shared memory.
- Run the SharedMemoryLoad application and click the Load button.
- Write some text in the input dialog.
- Send this application to the background.
- Run the ShowSharedMem application and click the Show from shared memory button. The text entered in the first application is displayed.
[edit | edit source]
SharedMemoryLoad
is a class derived from QWidget
. It contains the QSharedMemory
object as a member variable:
class SharedMemoryLoad : public QWidget
{
Q_OBJECT
...
private:
QSharedMemory sharedMem;
};
In the SharedMemoryLoad
class constructor, set the key for the shared memory object to "MySharedMemory":
SharedMemoryLoad::SharedMemoryLoad( QWidget *parent )
: QWidget( parent ),
sharedMem( "MySharedMemory" ) {
...
}
Loading a string into the shared memory:
void SharedMemoryLoad::loadIntoSharedMem()
{
// First, test whether a shared memory segment is already attached to the process.
// If so, detach it
if (sharedMem.isAttached())
{
sharedMem.detach();
}
...
QBuffer buffer;
buffer.open( QBuffer::ReadWrite );
QDataStream out( &buffer );
out << text;
int size = buffer.size();
if ( !sharedMem.create( size ) )
{
ui.LoadButton->setText(tr("Unable to create shared memory segment."));
return;
}
// Write into the shared memory
sharedMem.lock();
char *to = (char*)sharedMem.data();
const char *from = buffer.data().data();
memcpy( to, from, qMin( sharedMem.size(), size ) );
sharedMem.unlock();
}
[edit | edit source]
In the same way as SharedMemoryLoad
, ShowSharedMem
is derived from QWidget
and owns a QSharedMemory
object.
ShowSharedMem::ShowSharedMem(QWidget *parent)
: QWidget(parent),
sharedMem("MySharedMemory") {
...
}
Loading from the shared memory:
void ShowSharedMem::loadFromSharedMem()
{
if (!sharedMem.attach())
{
//If an attempt of reading from the shared memory before data is written
ui.showButton->setText(tr("Enter a text first"));
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();
// As this is the last process attached to the shared memory segment
// the shared memory segment is released, destroying its contents
sharedMem.detach();
}
Sample application[edit | edit source]
Note: This example cannot be tested in the emulator because running multiple Qt applications in the emulator is not possible. Starting the second application returns KErrNotSupported(-5)
.
zh-hans:QSharedMemory共享内存例子