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();



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM