轉載
初始化
- 實例化QSharedMemory對象
- 指定關鍵字key
開始通信
- 進程A寫:
- 檢測該進程是否連接到共享內存段,如果連接,則將該進程與共享內存段分離。
- 從系統足夠大的內存中得到一個新的共享內存段。
- 鎖定該共享內存段,以阻止第二個對話框進程訪問。
- 開始進行寫操作。
- 將共享內存段解鎖,然后第二個對話框進程就可以訪問了。
- 進程B讀:
- 將該進程與進程A創建的共享內存段綁定
- 鎖定共享內存段。
- 開始進行讀操作。
- 將共享內存段解鎖,然后將該進程與共享內存段分離。
代碼段
- 寫
void Dialog::loadFromFile()
{
if (sharedMemory.isAttached())
{
// 將該進程與共享內存段分離
if (!sharedMemory.detach())
qDebug() << "Unable to detach from shared memory.";
}
QString fileName = QFileDialog::getOpenFileName(0, QString(), QString(),
tr("Images (*.png *.xpm *.jpg)"));
QImage image;
if (!image.load(fileName))
{
qDebug() << "Selected file is not an image, please select another.";
return;
}
// 將數據加載到共享內存中
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << image;
int size = buffer.size();
// 創建共享內存段
if (!sharedMemory.create(size))
{
qDebug() << sharedMemory.errorString() << "\n 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();
}
- 讀
void MainWindow::loadFromMemory()
{
// 將共享內存與該進程綁定
if (!sharedMemory.attach())
{
qDebug() << "Unable to attach to shared memory segment.";
return;
}
// 從共享內存中讀取數據
QBuffer buffer;
QDataStream in(&buffer);
QImage image;
sharedMemory.lock();
buffer.setData((char*)sharedMemory.constData(), sharedMemory.size());
buffer.open(QBuffer::ReadOnly);
in >> image;
sharedMemory.unlock();
sharedMemory.detach();
m_pLabel->setPixmap(QPixmap::fromImage(image));
}