QSharedMemory 使用

轉載html

初始化

  1. 實例化QSharedMemory對象
  2. 指定關鍵字key

開始通訊

  1. 進程A寫:
  • 檢測該進程是否鏈接到共享內存段,若是鏈接,則將該進程與共享內存段分離。
  • 從系統足夠大的內存中獲得一個新的共享內存段。
  • 鎖定該共享內存段,以阻止第二個對話框進程訪問。
  • 開始進行寫操做。
  • 將共享內存段解鎖,而後第二個對話框進程就能夠訪問了。
  1. 進程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));
}

參考:Qt學習—qt共享內存的使用

參考:qt 共享內存(QSharedMemory)

轉載:Qt 之進程間通訊(共享內存)

相關文章
相關標籤/搜索