Qt共享記憶體QSharedMemory

晚餐吃什麼發表於2018-11-05

在Qt中可以利用QSharedMemory類輕鬆實現共享記憶體,這裡舉一個例子:

一個程式讀取一張圖片並寫入共享記憶體段,另一個程式從共享記憶體段讀取並顯示出來

寫共享記憶體段程式碼,用new形式:

    //在建構函式中寫
    sharedMemeory = new QSharedMemory(this);
    sharedMemeory->setKey("testtest");

    //在某個按鈕的點選槽處寫
    if(sharedMemeory->isAttached()){
        if(sharedMemeory->detach())
            qDebug()<<"detach...";
    }
    QPixmap map("C:/Users/admin/Desktop/me.jpg");
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStream stream(&buffer);
    stream<<map;
    //建立共享記憶體段
    int size=buffer.size();
    if(!sharedMemeory->create(size)){
        qDebug()<<sharedMemeory->errorString();
        return;
    }
    sharedMemeory->lock();
    void* to =sharedMemeory->data();
    void*from = (void*)buffer.data().data();
    memcpy(to,from,buffer.size());
    sharedMemeory->unlock();
    qDebug()<<"load succ";

讀共享記憶體段,用臨時變數即可

    QSharedMemory sharedMemeory;
    sharedMemeory.setKey("testtest");
    //共享記憶體段存在則繫結成功
    if(!sharedMemeory.attach()){
        qDebug()<<"attach error:"<<sharedMemeory.errorString();
        return;
    }
    QBuffer buffer;
    QDataStream stream(&buffer);
    sharedMemeory.lock();
    buffer.setData((char*)sharedMemeory.data(),sharedMemeory.size());
    sharedMemeory.unlock();
    buffer.open(QBuffer::ReadOnly);
    QPixmap pix;
    stream>>pix;
    ui->label->setPixmap(pix);

總結:

兩個程式都要設定相同的key

一個程式sharedMemory.create【建立共享記憶體段】

則一個程式sharedMemory.attach【關聯共享記憶體段】就可以進行讀寫了。

當最後一個連線共享記憶體的程式執行detach後,共享記憶體段將會被釋放,若返回false通常意味著該段要麼沒有被附加,要麼被另一個程式鎖定。

相關文章