qt 共享內存(QSharedMemory)


——————————————————寫入部分——————————————————


(本次程序基於控制檯程序)


首先 使用共享內存得召喚一下:



#include <QSharedMemory>


而後 聲明QSharedMemory類。而且命名爲smem


QSharedMemory smem;


因爲共享內存沒有訪問密鑰,則不能找到共享的內存。咱們給他設置一下訪問密鑰


QString key,sharedstring;


設置訪問密鑰


qDebug() << "Please input the shared memory key:"; 
cin >> key;


而後 聲明緩衝區和數據流。緩衝區用於轉換和保存數據(使用以前要引用這兩個庫)


QBuffer buffer; //緩衝區 
QDataStream qdsm(&buffer); //數據流


判斷輸入訪問密鑰以後,是否附加到共享內存。若是是,則分離


if(smem.isAttached()) smem.detach(); //判斷是否已經鏈接到共享內存塊 若是是的話 就先分離 



讓用戶輸入共享的數據


qDebug() << "Please input the string to share:"; 
cin >> sharedstring;


以可讀可寫的方式打開緩衝區


buffer.open(QBuffer::ReadWrite); //設置讀取模式


把共享的字符串輸入到數據流


qdsm << sharedstring; //輸入共享字符串到數據流 


輸入到數據流以後 會影響到緩衝區。緩衝區就會獲得數據的大小


int size = buffer.size(); //得到字節大小 


讓共享內存建立一段內存空間,空間大小爲緩衝區數據大小。而且檢測是否建立成功


if(!smem.create(size)) //檢測共享內存段是否建立成功 

qDebug() << "Could not create sharing memory"; 
return a.exec(); 
}


若是建立成功後。爲了讓程序作讀寫操做,不讓其餘的程序影響。咱們就先鎖上共享內存


smem.lock(); //鎖定共享內存


咱們先分別獲取建立後共享內存的數據的指針和要共享的字符串的數據的指針


char * to = (char *)smem.data(); //共享內存的數據 
const char * from = buffer.data().data(); //被共享內存的數據


利用內存拷貝函數(memcpy),把要共享的數據拷貝到共享數據的空間裏。拷貝的數據大小是二者中小的那位。哪位小就是要共享的數據的大小(沒有證明)


memcpy(to,from,qMin(smem.size(),size)); //把要共享的內存拷貝到被共享的內存


解鎖共享內存空間。使其可以被其餘程序訪問


smem.unlock(); //把共享內存解鎖






——————————————————讀取部分——————————————————


照樣不誤的引用上一部分的頭文件……


照常不忘的聲明共享內存


QSharedMemory sharemem;


聲明共享內存的密鑰和讀出來的字符串


QString key,readstring;


聲明緩衝區


QBuffer buffer;


聲明數據流


QDataStream out(&buffer);


讓用戶輸入共享內存的密鑰


qDebug() << "Please input the shared memory key:"; 
cin >> key;


設置共享內存的訪問密鑰。使其可以找到指定共享內存


sharemem.setKey(key);


找到指定的共享內存後關聯此內存 (此處能夠理解爲:去某人的家要東西)


sharemem.attach();


鎖上共享內存。(此處能夠理解爲:關上門,不容許其餘人進來)


sharemem.lock();


用緩衝區獲得共享內存關聯後獲得的數據和數據大小


buffer.setData((char *)sharemem.constData(),sharemem.size());


打開緩衝區進行訪問


buffer.open(QBuffer::ReadOnly);


使用數據流從緩衝區得到共享內存的數據,而後輸出到字符串中


out >> readstring;


解鎖共享內存空間 (此處能夠理解爲:開門,容許其餘人進來)


sharemem.unlock();


與共享內存空間分離 (此處能夠理解爲:我走了,我從家裏出去了)


sharemem.detach();


函數

相關文章
相關標籤/搜索